6

説明書より

CREATE MATERIALIZED VIEW は CREATE TABLE AS と似ていますが、ビューの初期化に使用されたクエリも記憶しているため、後で必要に応じて更新できる点が異なります。

私が理解しているように、具体化されたビューを更新すると re と同じ効果が得られるはずcreate view asです。しかし、それはここで起こることではありません。

列が 1 つのテーブルを作成する

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 | 

新しい列はどこにありますか? それは期待される動作ですか?もしそうなら、私はマニュアルが誤解を招くと思います。

4

1 に答える 1

5

SELECT *すべての同様の操作と同様に、実行時に展開されます ( CREATE VIEW, CREATE TABLE AS)

キーワードは、「遅延バインディング」ではなく「早期バインディング」です。Postgres は の実行時に存在する列のリストを保存しますがSELECT *、後で追加された列は自動的には含まれません。クエリ文字列自体は保存されず、展開後の内部表現と、すべてSELECT *の識別子の解決などのその他のもののみが保存されます。

REFRESH MATERIALIZED VIEW データ定義は変更せず、データのみを変更します:

REFRESH MATERIALIZED VIEWマテリアライズド ビューの内容を完全に置き換えます。

マニュアルはそれについてより明確にすることができますが、の動作と比較すると、CREATE TABLE AS次のことが明確になりました。

CREATE MATERIALIZED VIEWに似てCREATE TABLE ASいますが、ビューの初期化に使用されたクエリも記憶する点が異なります。

于 2013-09-24T02:09:25.097 に答える