Snowflake

Materialized Viewsとは?パフォーマンス最適化

2026-03-21
更新: 2026-03-27
NicheeLab編集部

Materialized View(MV)は、SELECT文の結果を物理的に格納し、ベーステーブルが更新されると自動的にリフレッシュされるSnowflakeのパフォーマンス最適化機能です。頻繁に実行される集約クエリやフィルタリングクエリの結果を事前計算しておくことで、クエリ応答時間を大幅に短縮します。Enterprise Edition以上で利用可能です。

Materialized Viewの仕組み

Materialized Viewは通常のViewとは異なり、SELECT文の結果がマイクロパーティションとして物理的に格納されます。ベーステーブルにDML操作が行われると、Snowflakeのバックグラウンドサービス(Serverless)が自動的にMVの内容を更新します。

比較項目通常のViewMaterialized View
データ格納なし(クエリ時にSELECT実行)あり(結果をマイクロパーティションに格納)
クエリ速度ベーステーブルのスキャン事前計算済み結果を直接参照
メンテナンス不要自動(Serverless Credit)
ストレージ消費なし結果分のストレージ消費
エディション全エディションEnterprise以上

CREATE MATERIALIZED VIEWの構文

-- 日別・地域別の売上集計MVを作成
CREATE OR REPLACE MATERIALIZED VIEW analytics.daily_sales_mv
AS
SELECT
  order_date,
  region,
  COUNT(*)        AS order_count,
  SUM(amount)     AS total_amount,
  AVG(amount)     AS avg_amount
FROM analytics.orders
WHERE order_date >= '2025-01-01'
GROUP BY order_date, region;

-- MVの確認
SHOW MATERIALIZED VIEWS IN SCHEMA analytics;

-- MVへのクエリ(通常のテーブルと同じようにアクセス)
SELECT *
FROM analytics.daily_sales_mv
WHERE region = 'APAC'
  AND order_date >= '2026-03-01'
ORDER BY order_date;

クエリの自動リライト

Snowflakeのオプティマイザは、ベーステーブルに対するクエリがMVの定義と一致する場合、自動的にMVを参照するようにクエリをリライトします。ユーザーがMVを明示的に指定する必要はありません。

-- このクエリはオプティマイザが自動的にdaily_sales_mvを参照する
SELECT region, SUM(amount) AS total
FROM analytics.orders
WHERE order_date >= '2026-03-01'
GROUP BY region;

-- Query ProfileのステップでMATERIALIZED_VIEW_MATCHが確認できる

Materialized Viewの制約事項

制約カテゴリ詳細
テーブル参照単一テーブルからのSELECTのみ(JOINは不可)
集約GROUP BY + 集約関数(SUM/COUNT/MIN/MAX/AVG)は使用可能
ウィンドウ関数OVER句は使用不可
サブクエリ使用不可
HAVING / ORDER BY / LIMIT使用不可
UDF使用不可
Non-deterministic関数CURRENT_TIMESTAMP()等は使用不可
ベーステーブル変更ベーステーブルの列削除や型変更を行うとMVが無効化される

自動メンテナンスとコスト管理

MVのリフレッシュはServerlessコンピュートで自動実行されるため、ユーザーのWarehouseリソースは消費しません。リフレッシュ頻度はベーステーブルのDML操作頻度に連動します。

-- リフレッシュ履歴の確認(直近7日間)
SELECT *
FROM TABLE(INFORMATION_SCHEMA.MATERIALIZED_VIEW_REFRESH_HISTORY(
  DATE_RANGE_START => DATEADD(DAY, -7, CURRENT_DATE()),
  DATE_RANGE_END => CURRENT_DATE()
))
ORDER BY start_time DESC;

-- Account Usageビューで長期的なコスト分析
SELECT
  table_name,
  materialized_view_name,
  SUM(credits_used) AS total_credits
FROM SNOWFLAKE.ACCOUNT_USAGE.MATERIALIZED_VIEW_REFRESH_HISTORY
WHERE start_time >= DATEADD(MONTH, -1, CURRENT_TIMESTAMP())
GROUP BY table_name, materialized_view_name
ORDER BY total_credits DESC;

Materialized ViewのClustering

Materialized View自体にもClustering Keysを定義できます。MVの結果セットが大きい場合、Clustering Keysを追加することで、MV上のクエリにおけるパーティションプルーニングの精度がさらに向上します。

-- MVにClustering Keysを追加
ALTER MATERIALIZED VIEW analytics.daily_sales_mv
  CLUSTER BY (order_date);

Dynamic Tablesとの比較

比較項目Materialized ViewDynamic Table
JOIN不可可能
サブクエリ不可可能
ウィンドウ関数不可可能
更新制御自動(ベーステーブル変更時に即座にリフレッシュ)TARGET_LAGで遅延許容値を指定
クエリの自動リライトあり(オプティマイザが自動的にMVを参照)なし(明示的にDynamic Tableをクエリ)
パイプラインDAG単一ビューで完結Dynamic Tables間の参照でDAGを自動構築
適用場面単一テーブルの集約・フィルタの高速化複数テーブルの複雑な変換パイプライン

活用パターン

  • ダッシュボード高速化:毎回数十億行をスキャンする集約クエリの結果をMVで事前計算し、BIツールの応答時間を数十秒から数秒に短縮
  • フィルタリング最適化:大規模テーブルの特定条件(WHERE句)に該当するデータだけをMVに格納し、スキャン量を削減
  • 半構造化データの事前展開:VARIANT型の頻繁にアクセスされるキーをMVでリレーショナルカラムに変換し、パフォーマンスを向上

ベストプラクティス

  • MVの数を適切に管理:同一ベーステーブルにMVを多数作成すると、各DML操作のたびに全MVがリフレッシュされコストが増大する
  • 更新頻度の高いテーブルでは慎重に検討:リアルタイムに更新されるテーブルではメンテナンスコストが過大になる可能性がある
  • SECURE MATERIALIZED VIEW:データ共有でMVの定義(SQL文)を隠蔽したい場合はSECUREオプションを使用
  • MVの削除:不要になったMVは速やかにDROP MATERIALIZED VIEWで削除し、メンテナンスコストを停止する

問題で確認

Performance Optimization

問題 1

Enterprise Editionで、単一の大規模テーブルからの日別集計クエリがBIダッシュボードで毎回数十秒かかっている。集計結果を事前計算して高速化したい。最も適切な機能はどれか。

  1. Dynamic TableをTARGET_LAG = '1 minute'で作成する
  2. Materialized Viewを作成し、オプティマイザによる自動リライトを活用する
  3. Temporary Tableに集計結果を毎時INSERT INTOで格納する
  4. Result Cacheの有効期限を延長して集計結果を永続的にキャッシュする

正解: B

単一テーブルからの集約クエリの高速化にはMaterialized Viewが最適です。MVはベーステーブルの更新時に自動リフレッシュされ、オプティマイザがベーステーブルへのクエリを自動的にMVにリライトします。Dynamic Tablesは複数テーブルのJOINなどMVの制約に該当する場合に適しますが、単一テーブルの集約にはMVの方が自動リライトの利点があります。Result Cacheはクエリ結果のキャッシュですが永続的ではなく、ベーステーブルが更新されると無効化されます。

よくある質問

Materialized Viewのメンテナンスコストはどのようなときかかりますか?

Materialized Viewのメンテナンスコストは、ベーステーブルにDML操作(INSERT/UPDATE/DELETE/MERGE)が行われた際に、Snowflakeのバックグラウンドサービスがビューの内容を自動的に更新するために発生します。Serverless Creditとして課金され、ベーステーブルの更新頻度とMV定義のSELECT文の複雑さに比例します。MATERIALIZED_VIEW_REFRESH_HISTORYテーブル関数でリフレッシュ履歴とクレジット消費を確認できます。更新頻度が非常に高いテーブルでは、MVのメンテナンスコストが過大になる可能性があるため、コスト対効果を事前に検証します。

Materialized Viewで使えるSQL構文に制約はありますか?

はい、Materialized ViewのSELECT文にはいくつかの制約があります。JOINは使用できず、単一テーブルからのSELECTのみサポートされています。サブクエリ、ウィンドウ関数(OVER句)、HAVING句、ORDER BY句、LIMIT句は使用できません。GROUP BYと集約関数(SUM/COUNT/MIN/MAX/AVG)は使用可能です。UDF(ユーザー定義関数)も使用できません。これらの制約に該当する場合はDynamic Tablesの利用を検討します。

Materialized ViewとDynamic Tablesはどのように使い分けますか?

Materialized Viewは単一テーブルの集約・フィルタリング結果を事前計算してキャッシュする機能で、クエリが自動的にMVを参照するため透過的です。Dynamic Tablesは複数テーブルのJOINやサブクエリなど複雑な変換を宣言的に定義でき、TARGET_LAGで更新遅延を制御します。単純な集約やフィルタの高速化にはMV、複雑な変換パイプラインにはDynamic Tablesが適しています。Dynamic TablesはEnterprise Edition以上で利用可能です。

この記事で学んだ内容を問題で確認しましょう

16,000問以上の問題で実力チェック

無料で問題を解いてみる
この記事の著者

NicheeLab編集部

データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。


関連記事
Snowflake

Snowflake資格一覧|全11試験(SnowPro)の難易度・費用

Snowflake認定資格(SnowPro)全11試験の一覧・難易度・費用・出題範囲を徹底解説。...

Snowflake

Snowflake試験の難易度ランキング|全11資格を徹底比較

Snowflake(SnowPro)認定全11試験の難易度をランキング形式で比較。学習時間・合格に必要なスキルから分析。...

Snowflake

Snowflake資格の勉強方法|効率的な学習ルートと合格のコツ

Snowflake認定資格(SnowPro)に最短で合格するための勉強方法。公式リソース・学習スケジュールを徹底ガイド。...

Snowflake

SnowPro Core試験完全解説|出題範囲・問題例・合格戦略

SnowPro Core Certification(COF-C03)を徹底解説。出題範囲・100問の試験形式・合格ライ...

Snowflake

SnowPro Platform Associate完全解説|入門試験の攻略

SnowPro Associate: Platform Certification(SOL-C01)を徹底解説。最も簡単...

Snowflakeの記事一覧 (102件)
© 2026 NicheeLab All rights reserved.