Clo*_*eto 6 postgresql view materialized-views postgresql-9.3
从手册
CREATE MATERIALIZED VIEW 类似于 CREATE TABLE AS,不同之处在于它还会记住用于初始化视图的查询,以便以后可以根据需要刷新。
据我了解,刷新物化视图应该与 re 具有相同的效果create view as。但这不是这里发生的事情。
创建一个只有一列的表
drop table if exists t cascade;
create table t (a int);
insert into t (a) values (1);
Run Code Online (Sandbox Code Playgroud)
创建物化视图
create materialized view mat_view_t as
select * from t ;
select * from mat_view_t;
a
---
1
Run Code Online (Sandbox Code Playgroud)
现在一列被添加到源表
alter table t add column b int;
\d t
Table "public.t"
Column | Type | Modifiers
--------+---------+-----------
a | integer |
b | integer |
Run Code Online (Sandbox Code Playgroud)
然后刷新物化视图
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 |
Run Code Online (Sandbox Code Playgroud)
新专栏在哪里?这是预期的行为吗?如果是,那么我认为该手册具有误导性。
SELECT *在执行时扩展,就像所有类似的操作 ( CREATE VIEW, CREATE TABLE AS)
关键词是“早期绑定”而不是“后期绑定”。Postgres 保存在 执行时存在的列列表,SELECT *稍后添加的列不会自动包含在内。该查询字符串本身不会被保存,只有内部表示以后扩大SELECT *和其他东西一样解决所有标识符。
REFRESH MATERIALIZED VIEW 从不更改数据定义,仅更改数据:
REFRESH MATERIALIZED VIEW完全替换物化视图的内容。
手册可能会更明确地说明它,但与行为CREATE TABLE AS的比较使我清楚:
CREATE MATERIALIZED VIEW与 类似CREATE TABLE AS,除了它还记住用于初始化视图的查询。
| 归档时间: |
|
| 查看次数: |
2067 次 |
| 最近记录: |