Materialized View(MV)は、SELECT文の結果を物理的に格納し、ベーステーブルが更新されると自動的にリフレッシュされるSnowflakeのパフォーマンス最適化機能です。頻繁に実行される集約クエリやフィルタリングクエリの結果を事前計算しておくことで、クエリ応答時間を大幅に短縮します。Enterprise Edition以上で利用可能です。
Materialized Viewは通常のViewとは異なり、SELECT文の結果がマイクロパーティションとして物理的に格納されます。ベーステーブルにDML操作が行われると、Snowflakeのバックグラウンドサービス(Serverless)が自動的にMVの内容を更新します。
| 比較項目 | 通常のView | Materialized View |
|---|---|---|
| データ格納 | なし(クエリ時にSELECT実行) | あり(結果をマイクロパーティションに格納) |
| クエリ速度 | ベーステーブルのスキャン | 事前計算済み結果を直接参照 |
| メンテナンス | 不要 | 自動(Serverless Credit) |
| ストレージ | 消費なし | 結果分のストレージ消費 |
| エディション | 全エディション | Enterprise以上 |
-- 日別・地域別の売上集計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が確認できる| 制約カテゴリ | 詳細 |
|---|---|
| テーブル参照 | 単一テーブルからの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 Keysを定義できます。MVの結果セットが大きい場合、Clustering Keysを追加することで、MV上のクエリにおけるパーティションプルーニングの精度がさらに向上します。
-- MVにClustering Keysを追加
ALTER MATERIALIZED VIEW analytics.daily_sales_mv
CLUSTER BY (order_date);| 比較項目 | Materialized View | Dynamic Table |
|---|---|---|
| JOIN | 不可 | 可能 |
| サブクエリ | 不可 | 可能 |
| ウィンドウ関数 | 不可 | 可能 |
| 更新制御 | 自動(ベーステーブル変更時に即座にリフレッシュ) | TARGET_LAGで遅延許容値を指定 |
| クエリの自動リライト | あり(オプティマイザが自動的にMVを参照) | なし(明示的にDynamic Tableをクエリ) |
| パイプラインDAG | 単一ビューで完結 | Dynamic Tables間の参照でDAGを自動構築 |
| 適用場面 | 単一テーブルの集約・フィルタの高速化 | 複数テーブルの複雑な変換パイプライン |
Performance Optimization
問題 1
Enterprise Editionで、単一の大規模テーブルからの日別集計クエリがBIダッシュボードで毎回数十秒かかっている。集計結果を事前計算して高速化したい。最も適切な機能はどれか。
正解: 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以上で利用可能です。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
Snowflake資格一覧|全11試験(SnowPro)の難易度・費用
Snowflake認定資格(SnowPro)全11試験の一覧・難易度・費用・出題範囲を徹底解説。...
Snowflake試験の難易度ランキング|全11資格を徹底比較
Snowflake(SnowPro)認定全11試験の難易度をランキング形式で比較。学習時間・合格に必要なスキルから分析。...
Snowflake資格の勉強方法|効率的な学習ルートと合格のコツ
Snowflake認定資格(SnowPro)に最短で合格するための勉強方法。公式リソース・学習スケジュールを徹底ガイド。...
SnowPro Core試験完全解説|出題範囲・問題例・合格戦略
SnowPro Core Certification(COF-C03)を徹底解説。出題範囲・100問の試験形式・合格ライ...
SnowPro Platform Associate完全解説|入門試験の攻略
SnowPro Associate: Platform Certification(SOL-C01)を徹底解説。最も簡単...