✏️

Snowflake で MATERIALIZED VIEW を作成する

に公開

公式ドキュメント

https://docs.snowflake.com/en/user-guide/views-materialized#label-privileges-on-schema-of-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