dbt

dbtのmaterialized_viewマテリアライゼーションをウェアハウスネイティブに使いこなす

2026-04-19
NicheeLab編集部

dbtはモデルを視点(view)、物理表(table)、増分(incremental)として構築できますが、近年は倉庫側のマテビュー(materialized view)を直接活用するmaterialized_viewマテリアライゼーションも実戦投入されつつあります。

ただし、これはアダプタ(例: dbt-snowflake, dbt-databricks)がサポートする場合に限られ、DDLの制限やリフレッシュ挙動は各ウェアハウスの仕様に従います。試験対策としては、dbtの責務とウェアハウスの責務を切り分けて理解することが重要です。

materialized_viewの前提とdbtでの位置付け

dbtのmaterialized_viewマテリアライゼーションは、アダプタがウェアハウスのネイティブなマテリアライズド・ビューを作成するためのラッパです。dbtがDAGや依存関係、スキーマ命名、権限付与などの周辺を担い、実データの永続化・増分更新はウェアハウス側のエンジンとメンテナンスに委ねます。

サポート有無と制約はウェアハウスごとに異なります。Snowflakeはマテビューをサービスとして自動メンテナンスし、一定の制約(非決定関数の禁止、他ビュー参照の制限など)がかかります。DatabricksもMaterialized View機能を提供し、バックグラウンドでインクリメンタルに維持されます。いずれも最新の公式ドキュメントでCREATE/ALTERの仕様を確認してください。

  • dbtはDDLを発行するが、更新・維持の実体はウェアハウス側の責務
  • コンパイル時にアダプタがmaterialized_viewを未サポートならエラーになる
  • ビュー特有の制約(決定性、依存先、サブクエリ構造など)を満たすSQL設計が前提

dbtとウェアハウスネイティブmaterialized viewの関係

dbt runref/依存解決model.sqlJinja/SQLCREATE MATERIALIZED VIEWadapter発行のDDL他モデルsources, refsウェアハウスの維持機構自動リフレッシュ/維持BI/SQLクエリ低レイテンシdbtはDDLを発行し、更新維持はウェアハウスが担当、BIクエリは低レイテンシで応答

ウェアハウスネイティブの挙動と制約(Snowflake/Databricks)

Snowflakeのマテビューは自動メンテナンス対象で、基表の変更に応じて差分更新されます。非決定性関数や他のビュー参照などは制限され、定期的な維持にクレジットが消費されます。必要に応じて自動メンテナンスを一時停止・再開、あるいは再構築(REBUILD系の操作)を行えます。

Databricksのマテビューは、宣言的に定義したSELECTに基づいて背景処理で維持されます。再構築(REBUILDに相当)を明示的に実行でき、クエリは決定的であることが求められます。いずれもDDLや制限はバージョンやエディションで差分が出やすいため、導入前に公式ドキュメントを確認してください。

  • Snowflake: 自動メンテナンス、DDLでSUSPEND/RESUMEやREBUILDに相当する操作が可能
  • Databricks: BACKGROUND維持、ALTER MATERIALIZED VIEW ... REBUILDが代表的操作
  • 両者とも非決定的関数や一部の依存構造は不可。SQLは単純化・正規化が安全

設計判断:view / materialized_view / table / incrementalの比較

低レイテンシでの参照、更新頻度、コスト、DDL制限の観点で使い分けます。マテビューは読み取り高速化と自動差分維持が利点ですが、SQLの自由度はテーブルより狭く、維持コストが発生します。増分テーブル(incremental)はdbt側で制御可能な一方、更新ロジックの設計・検証負荷は高めです。

  • 要件を「更新頻度×参照レイテンシ×制約許容度×コスト」でマトリクス化
  • まずはviewで要件確認→恒常的に重いならmaterialized_viewやincrementalに移行
手法リフレッシュストレージ制約/柔軟性
view都度クエリ(キャッシュ依存)ほぼ無し最も自由。重い集計は遅い
materialized_viewウェアハウスが自動差分維持あり(格納+維持コスト)DDL/SQLに制限。決定性が必要
table手動再作成/差し替えあり自由だが更新はバッチ中心
incremental(dbt)dbtロジックで差分UPSERTあり(ジョブ時間に依存)柔軟だが実装・検証が重い

実装:dbtでの設定と依存制御

dbtモデルでmaterialized='materialized_view'を指定します。アダプタがサポートしていれば、CREATE MATERIALIZED VIEW(または同等のDDL)が発行されます。--full-refreshはマテビューでは未対応または再作成扱いになる場合があり、実行前に環境ごとの挙動を確認してください。

依存関係は通常どおりrefで管理されます。テストやドキュメントはモデル名に紐づき、dbt testは作成済みマテビューに対してSELECTを実行します。権限付与(grants)もアダプタが対応していれば適用されます。

  • SQLは決定的・単純化を意識(日付関数は固定タイムゾーンやDATE_TRUNCレベルに揃える)
  • ビュー制約を満たせない場合はincremental/tableへ設計変更
  • 本番での置換はトランザクション境界とダウンタイム最小化を考慮

dbtモデル定義例(Snowflake/Databricks想定、実行環境の制約に依存)

-- models/mv_orders_daily.sql
{{ config(
    materialized = 'materialized_view',
    tags = ['core', 'mv'],
    persist_docs = {'relation': true, 'columns': true}
) }}

-- 注: 非決定的関数や他ビュー依存は避ける
select
  o.customer_id,
  cast(o.order_date as date) as order_date,
  count(*) as orders,
  sum(o.total_amount) as revenue
from {{ ref('stg_orders') }} as o
where o.order_status = 'completed'
group by 1, 2;

# schema.yml(一部)
version: 2
models:
  - name: mv_orders_daily
    description: 日次の受注集計(マテビュー)。参照レイテンシを下げるためにウェアハウスで自動維持。
    tests:
      - not_null:
          column_name: customer_id
      - not_null:
          column_name: order_date
    config:
      grants:
        select: ['bi_reader']

# 運用補助(例:DatabricksやSnowflakeのDDLは環境で確認)
-- Snowflake例(自動更新の一時停止/再開)
-- ALTER MATERIALIZED VIEW <db>.<schema>.mv_orders_daily SUSPEND;
-- ALTER MATERIALIZED VIEW <db>.<schema>.mv_orders_daily RESUME;

-- Databricks例(再構築)
-- ALTER MATERIALIZED VIEW <catalog>.<schema>.mv_orders_daily REBUILD;

運用:リフレッシュ、失敗時対応、テストと監視

リフレッシュはウェアハウスが担います。負荷の高い時間帯に維持が走るとクレジット/DBU消費や並行実行に影響するため、SLAに合わせて自動維持のスケジューリング/一時停止を検討します。再構築はDDLで明示実行します。

スキーマ変更は置換(CREATE OR REPLACE)や再作成が必要になることがあります。dbtのrunで差し替えるとバックグラウンド再構築が走り、短時間は古い結果が参照される可能性があります。重要クエリはカナリア照合やステージング環境での事前検証を推奨します。

  • コスト監視:Snowflakeはメンテナンスクレジット、DatabricksはDBU消費を可視化
  • 失敗検知:dbt test+ウェアハウスのイベント/クエリ履歴で二重監視
  • 容量管理:不要なマテビューはSUSPEND→削除でコスト最適化

試験対策の落とし穴と実務Tips

dbtのAnalytics Engineer試験では、materializationsの選択基準、ref/ソース管理、テスト/ドキュメント、環境分離の理解が問われます。materialized_viewは「ウェアハウスが差分維持するビュー」であり、dbt自体はETL/ELT実行フレームワークとしてDDLを発行する立場、という役割分担を明確に説明できると有利です。

実務では、スパイク時のクエリ負荷軽減やダッシュボードの安定応答に特に有効です。一方で、自由度の高い変換や非決定的ロジックが必要なときはincremental/tableへ切り替える判断を持っておきましょう。

  • 判断基準は「制約に適合するか」「低レイテンシが要るか」「コスト許容か」の三つ
  • 本番リリース前にDDL制限チェックリストを通し、失敗時ロールバック手順を準備
  • ビュー層のカーディナリティや集計粒度は明示し、下流のJOIN増加を抑える

問題で確認

Analytics Engineer

問題 1

高頻度で参照される日次集計を低レイテンシで提供したい。SQLは決定的で、ウェアハウスがマテビューをサポートしている。dbtで最適なアプローチはどれか?

  1. モデルをmaterialized_viewにし、ウェアハウスの自動差分維持を活用する
  2. モデルをviewにし、ダッシュボード側のキャッシュに依存する
  3. モデルをtableにして毎回dbt seedで差し替える
  4. incrementalモデルにして常に全件再計算のSQLを実行する

正解: A

要件は低レイテンシかつ決定的SQL。ウェアハウスがサポートしているなら、materialized_viewは自動差分維持で読み取りを高速化できる。viewは重い集計で遅くなりやすく、tableの全差し替えやincrementalの全件再計算は非効率。

よくある質問

dbtでmaterialized_viewを指定したのにエラーになるのはなぜ?

アダプタが未サポート、あるいはモデルのSQLがウェアハウスのマテビュー制約(非決定性、他ビュー参照など)に違反している可能性があります。該当アダプタのドキュメントとウェアハウスのCREATE MATERIALIZED VIEWの制約を確認してください。

full-refreshでマテビューを再作成できますか?

環境によります。いくつかのアダプタではfull-refreshが未対応、もしくはCREATE OR REPLACEにより結果的に再作成(再構築)となる場合があります。事前に検証し、必要ならDDL(SUSPEND/RESUMEやREBUILD等)で制御してください。

権限付与(grants)はmaterialized_viewにも適用できますか?

アダプタがgrantsに対応していれば適用できます。dbtのconfigでgrantsを設定し、対象ロールにSELECT権限などを付与します。アダプタ未対応の場合はpost-hookや手動DDLで補完します。

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

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

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

NicheeLab編集部

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


関連記事
dbt

dbt Model の基礎: SQL で定義する変換の最小単位

Analytics Engineer 向けに、dbt Model の定義、マテリアライゼーション、依存関係、インクリメン...

dbt

dbt Analytics Engineer 試験ガイド: 出題範囲・配点・申込の実務視点

dbt Analytics Engineer 認定の出題範囲、配点の考え方、申込から受験までの流れを、公式ドキュメントの...

dbt

dbt Cloud と dbt Core の違いと選び方:Analytics Engineer 試験に効く要点

dbt Cloud と dbt Core の機能差を、実務と資格対策の両面から整理。スケジューリング、IDE、RBAC、...

dbt

dbt プロジェクト構造ガイド: models / seeds / macros の実務レイアウト

Analytics Engineer 向けに、dbt プロジェクトのディレクトリ構造と命名規約、dbt_project....

dbt

dbt_project.yml の読み方:主要設定と命名を最短で掴む

dbt_project.yml の必須キー、命名解決(database.schema.identifier)、設定優先度...

dbtの記事一覧 (100件)
© 2026 NicheeLab All rights reserved.