✏️
Snowflake で MATERIALIZED VIEW を作成する
公式ドキュメント
Materialized View とは
- 通常の View とは異なり、クエリの実行結果が事前にデータセットとして Snowflake 上に保持される
特徴
- パフォーマンスは向上するが、ストレージコストとコンピュートコストが発生する
- キャッシュを持つため、通常のテーブルと比較してパフォーマンスが良い
- 通常の View はキャッシュを持たない
- Materialized View から取得されるデータは常に最新
Materialized View が有効なケース
- ベーステーブルが大規模な場合
- ベーステーブルに比べ、クエリ結果の列や行が少ない場合
- クエリが複雑で頻繁に実行される場合
- 外部テーブルへのクエリ実行でパフォーマンスを向上したい場合
- 外部テーブルはSnowflake上にデータがなく、クエリ実行の都度外部からデータを取得するためパフォーマンスに懸念あり
- ベーステーブルのデータ更新が頻繁ではない場合
通常の View との使い分け

前提条件
- Enterprise Edition 以上
- スキーマに対する CREATE MATERIALIZED VIEW 権限
- もしない場合は以下を実行
GRANT CREATE MATERIALIZED VIEW ON SCHEMA <schema_name> TO ROLE <role_name>;
- もしない場合は以下を実行
- 対象テーブルの SELECT 権限
- スキーマ内に同名のテーブル、ビューが存在しないこと
制約事項
- ベーステーブルは1つのみ
- 結合は自己結合も含めて不可
- 通常の View, 他の Materialized View, UDTF に対するクエリは不可
- その他、利用できる関数などにもろもろ制限あり。代表的なものは以下
- Window 関数利用不可
- UDF 利用不可
- HAVING 句, LIMIT 句, ORDER BY 句利用不可
その他注意事項
- ベーステーブルが削除(DROP)された場合、Materialized View は残るため個別に削除が必要
- 基本的に SELECT * は利用せず、カラム名を指定すること
- コストが高くなるため
- SELECT * で定義しても、ベーステーブルに後から新しく追加されたカラムは Materialized View には追加されないため
基本的なクエリ
DDL
作成 (CREATE MATERIALIZED VIEW)
CREATE MATERIALIZED VIEW mymv
COMMENT='Test view'
AS
SELECT col1, col2 FROM mytable;
変更 (ALTER MATERIALIZED VIEW)
ALTER MATERIALIZED VIEW mymv RENAME TO my_mv;
削除 (DROP MATERIALIZED VIEW)
DROP MATERIALIZED VIEW my_mv;
情報取得
カラム情報 (DESCRIBE MATERIALIZED VIEW)
DESC MATERIALIZED VIEW my_mv;
アクセス権のある Materialized View のリスト表示 (SHOW MATERIALIZED VIEWS)
SHOW MATERIALIZED VIEWS;
DML (INSERT, UPDATE, DELETE) → 不可
Materialized View に対して DML 文を実行することは不可
Discussion