Обновление материализованного представления не включает добавленный столбец

Из руководства.

CREATE MATERIALIZED VIEW аналогичен CREATE TABLE AS, за исключением того, что он также запоминает запрос, использованный для инициализации представления, чтобы его можно было обновить позже по запросу.

Насколько я понимаю, обновление материализованного представления должно иметь тот же эффект, что и recreate view as. Но это не то, что происходит здесь.

Создайте таблицу с одним столбцом

drop table if exists t cascade;

create table t (a int);

insert into t (a) values (1);

Создайте материализованное представление

create materialized view mat_view_t as
select * from t ;

select * from mat_view_t;
 a 
---
 1

Теперь столбец добавлен в исходную таблицу

alter table t add column b int;

\d t
       Table "public.t"
 Column |  Type   | Modifiers 
--------+---------+-----------
 a      | integer | 
 b      | integer | 

И затем материализованное представление обновляется

refresh materialized view mat_view_t;

select * from mat_view_t;
 a 
---
 1

\d mat_view_t 
Materialized view "public.mat_view_t"
 Column |  Type   | Modifiers 
--------+---------+-----------
 a      | integer | 

Где новая колонка? Это ожидаемое поведение? Если это так, то я думаю, что руководство вводит в заблуждение.


person Clodoaldo Neto    schedule 22.09.2013    source источник


Ответы (1)


SELECT * расширяется во время выполнения, как и все подобные операции (CREATE VIEW, CREATE TABLE AS)

Ключевое слово здесь «раннее связывание», а не «позднее связывание». Postgres сохраняет список столбцов, присутствующих во время выполнения SELECT *, столбцы, добавленные позже, не включаются автоматически. Сама строка запроса не сохраняется, только внутреннее представление после расширения SELECT * и других действий, таких как разрешение всех идентификаторов.

REFRESH MATERIALIZED VIEW никогда не изменяет определение данных , только данные:

REFRESH MATERIALIZED VIEW полностью заменяет содержимое материализованного представления.

Руководство могло бы быть более подробным об этом, но сравнение с поведением CREATE TABLE AS прояснил для меня:

CREATE MATERIALIZED VIEW похож на CREATE TABLE AS, за исключением того, что он также запоминает запрос, используемый для инициализации представления.

person Erwin Brandstetter    schedule 24.09.2013
comment
Сохранение обработанного макросом запроса, скорее всего, является правильным ответом. Но фраза, которая проясняет для вас, делает ее непонятной для меня: за исключением того, что она также запоминает запрос, используемый для инициализации представления - person Clodoaldo Neto; 24.09.2013
comment
@ClodoaldoNeto: Конечно, не мешало бы прямо указать это в руководстве. - person Erwin Brandstetter; 24.09.2013