Ich versuche pg_dump (v9.3.4) von einer db und pg_restore in eine andere (v9.3.6). Ich habe mehrere materialisierte Ansichten (einige mit Indizes und einige ohne Indizes). Eine meiner materialisierten Ansichten wird als Tabelle ausgegeben (ich habe dies anhand der Ausgabe von pg_dump bestätigt). Wie kann ich es als materialisierte Ansicht ausgeben?Wie kann ich eine materialisierte Ansicht als materialisierte Ansicht und nicht als Tabelle ausgeben?
Hier ist, was ich in meinem pg_dump Ausgabe sehen:
CREATE TABLE my_mv (
/* ... */
);
/* ... */
CREATE INDEX my_mv_col_1_idx ON my_mv USING btree (col_1);
/* ... */
CREATE RULE "_RETURN" AS
ON SELECT TO my_mv DO INSTEAD WITH tmp_1 AS (
/* ... */
Meine anderen MVs wie folgt aussehen:
CREATE MATERIALIZED VIEW my_good_mv AS
SELECT /* ... */
WITH NO DATA;
/* ... */
CREATE INDEX my_good_mv_job_col_1_idx ON my_good_mv USING btree (col_1);
/* ... */
REFRESH MATERIALIZED VIEW my_good_mv;
Ich habe bestätigt, dass es ein MV ist:
xxx=# SELECT relkind FROM pg_class WHERE oid = 'public.my_mv'::regclass;
relkind
---------
m
(1 row)
Hier ist die MV-Definition:
create materialized view mv_members
(
id,
state,
tags,
primary_job_function, job_functions,
min_salary,
current_level, current_employer, desired_employment_types, desired_org_sizes,
years_of_pro_experience,
current_location, current_location_parents, desired_locations, desired_location_parents,
creation_date)
as
with wh as (
select poach_id, employer
from (
select poach_id, employer, row_number() over (partition by poach_id order by employer) as n
from work_histories
where end_year is null) t
where n = 1),
tags as (
select parent_id as poach_id, array_remove(array_agg(tag), null) as tags
from poach_tags
group by poach_id),
jfns as (
select poach_id, array_remove(array_agg(job_function_id), null) as job_functions
from poach_job_functions
group by poach_id),
pjf as (
select poach_id, job_function_id
from (
select poach_id, job_function_id, row_number() over (partition by poach_id order by job_function_id) as n
from poach_job_functions
where is_primary = true) t
where n = 1),
pdl as (
select
p.id as poach_id,
case when p.desired_locations != '{}'
then p.desired_locations
else
case when p.mapped_desired_locations is null
then '{}'
else p.mapped_desired_locations
end
end as desired_locations
from poaches p),
pdla as (
select pdl.poach_id, unnest(l.ancestors) as ancestor
from pdl
inner join locations l on l.id = any(pdl.desired_locations)),
min_salaries as (
select p.id as poach_id,
case when min_salary_min is not null
then min_salary_min
else
case when min_salary_max is not null
then 0
else
case when current_salary_min is not null
then current_salary_min
else
case when current_salary_max is not null
then 0
else null
end
end
end
end as min_salary
from poaches p)
select
p.id,
s.state,
coalesce(t.tags, '{}'),
pjf.job_function_id,
coalesce(jfns.job_functions, '{}') as job_functions,
min_salaries.min_salary as min_salary,
p.current_level,
wh.employer,
p.employment_types,
p.desired_org_sizes,
p.years_of_pro_experience,
p.current_location_id as current_location,
array_remove(array_append(cl.ancestors, p.current_location_id), null) as current_location_parents,
pdl.desired_locations,
array_remove(array_cat(array_agg(pdla.ancestor), pdl.desired_locations), null) as desired_location_parents,
p.creation_date
from
poaches p
inner join entity_states s on p.id = s.entity_id and s.is_current = true
inner join min_salaries on p.id = min_salaries.poach_id
left outer join tags t on p.id = t.poach_id
left outer join wh on p.id = wh.poach_id
left outer join pjf on p.id = pjf.poach_id
left outer join jfns on p.id = jfns.poach_id
left outer join locations cl on p.current_location_id = cl.id
left outer join pdl on p.id = pdl.poach_id
left outer join pdla on p.id = pdla.poach_id
where p.is_active = true
group by p.id, s.state, t.tags, pjf.job_function_id, job_functions, min_salary, p.current_level, wh.employer, p.employment_types, p.desired_org_sizes, current_location, current_location_parents, pdl.desired_locations, p.creation_date;
create index on mv_members (state);
create index on mv_members (primary_job_function);
create index on mv_members (job_functions);
create index on mv_members (current_level);
create index on mv_members (desired_employment_types);
create index on mv_members (desired_org_sizes);
create index on mv_members (desired_locations);
create index on mv_members (desired_location_parents);
create index on mv_members (creation_date);
zu exportieren * Ist * es ein MV? Was bekommst du für 'SELECT relkind FROM pg_class WHERE oid = 'public.my_mv' :: regclass'? 'm' oder' r'? In älteren Versionen von Postgres MVs wurden als Tabelle implementiert und von Hand aktualisiert, vielleicht ist dies ein Stück Vermächtnis? –
Ich bekomme "m" zurück (siehe meine bearbeitete Frage). Ich nehme an, 'm' ist für materialisierte Ansicht? –
Ja. 'm' ist für MV. Das ist seltsam. Ich denke, wenn Sie das Objekt mit der Standard-'CREATE MATERIALIZED VIEW'-Syntax löschen und neu erstellen, sollte die Anomalie verschwinden. –