【问题标题】:Refreshing a materialized view does not include added column刷新物化视图不包括添加的列
【发布时间】:2013-09-27 17:03:41
【问题描述】:

来自manual

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 | 

新列在哪里?这是预期的行为吗?如果是,那么我认为该手册具有误导性。

【问题讨论】:

    标签: postgresql view materialized-views postgresql-9.3


    【解决方案1】:

    SELECT * 在执行时扩展,就像所有类似的操作一样(CREATE VIEWCREATE TABLE AS

    关键词是“早期绑定”,而不是“后期绑定”。 Postgres 保存SELECT * 执行时存在的列列表,稍后添加的列自动包含在内。 查询字符串本身没有保存,只有内部表示之后扩展SELECT *和其他东西,如解析所有标识符。

    REFRESH MATERIALIZED VIEW从不改变数据定义,只有数据:

    REFRESH MATERIALIZED VIEW 完全替换物化视图的内容。

    手册可能更明确,但comparison to the behavior of CREATE TABLE AS 让我明白了:

    CREATE MATERIALIZED VIEW 类似于 CREATE TABLE AS,除了 它还记得用于初始化视图的查询。

    【讨论】:

    • 保存宏处理的查询很可能是正确的答案。但是让你明白的那句话恰恰是让我觉得很模糊的那句话:除了它还记得用于初始化视图的查询
    • @ClodoaldoNeto:在手册中明确说明这一点当然不会有什么坏处。
    猜你喜欢
    • 2014-07-11
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    • 2017-11-13
    • 1970-01-01
    • 2018-04-20
    • 2021-01-09
    • 2017-06-07
    相关资源
    最近更新 更多