dbtはモデルを視点(view)、物理表(table)、増分(incremental)として構築できますが、近年は倉庫側のマテビュー(materialized view)を直接活用するmaterialized_viewマテリアライゼーションも実戦投入されつつあります。
ただし、これはアダプタ(例: dbt-snowflake, dbt-databricks)がサポートする場合に限られ、DDLの制限やリフレッシュ挙動は各ウェアハウスの仕様に従います。試験対策としては、dbtの責務とウェアハウスの責務を切り分けて理解することが重要です。
dbtのmaterialized_viewマテリアライゼーションは、アダプタがウェアハウスのネイティブなマテリアライズド・ビューを作成するためのラッパです。dbtがDAGや依存関係、スキーマ命名、権限付与などの周辺を担い、実データの永続化・増分更新はウェアハウス側のエンジンとメンテナンスに委ねます。
サポート有無と制約はウェアハウスごとに異なります。Snowflakeはマテビューをサービスとして自動メンテナンスし、一定の制約(非決定関数の禁止、他ビュー参照の制限など)がかかります。DatabricksもMaterialized View機能を提供し、バックグラウンドでインクリメンタルに維持されます。いずれも最新の公式ドキュメントでCREATE/ALTERの仕様を確認してください。
dbtとウェアハウスネイティブmaterialized viewの関係
Snowflakeのマテビューは自動メンテナンス対象で、基表の変更に応じて差分更新されます。非決定性関数や他のビュー参照などは制限され、定期的な維持にクレジットが消費されます。必要に応じて自動メンテナンスを一時停止・再開、あるいは再構築(REBUILD系の操作)を行えます。
Databricksのマテビューは、宣言的に定義したSELECTに基づいて背景処理で維持されます。再構築(REBUILDに相当)を明示的に実行でき、クエリは決定的であることが求められます。いずれもDDLや制限はバージョンやエディションで差分が出やすいため、導入前に公式ドキュメントを確認してください。
低レイテンシでの参照、更新頻度、コスト、DDL制限の観点で使い分けます。マテビューは読み取り高速化と自動差分維持が利点ですが、SQLの自由度はテーブルより狭く、維持コストが発生します。増分テーブル(incremental)はdbt側で制御可能な一方、更新ロジックの設計・検証負荷は高めです。
| 手法 | リフレッシュ | ストレージ | 制約/柔軟性 |
|---|---|---|---|
| view | 都度クエリ(キャッシュ依存) | ほぼ無し | 最も自由。重い集計は遅い |
| materialized_view | ウェアハウスが自動差分維持 | あり(格納+維持コスト) | DDL/SQLに制限。決定性が必要 |
| table | 手動再作成/差し替え | あり | 自由だが更新はバッチ中心 |
| incremental(dbt) | dbtロジックで差分UPSERT | あり(ジョブ時間に依存) | 柔軟だが実装・検証が重い |
dbtモデルでmaterialized='materialized_view'を指定します。アダプタがサポートしていれば、CREATE MATERIALIZED VIEW(または同等のDDL)が発行されます。--full-refreshはマテビューでは未対応または再作成扱いになる場合があり、実行前に環境ごとの挙動を確認してください。
依存関係は通常どおりrefで管理されます。テストやドキュメントはモデル名に紐づき、dbt testは作成済みマテビューに対してSELECTを実行します。権限付与(grants)もアダプタが対応していれば適用されます。
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で差し替えるとバックグラウンド再構築が走り、短時間は古い結果が参照される可能性があります。重要クエリはカナリア照合やステージング環境での事前検証を推奨します。
dbtのAnalytics Engineer試験では、materializationsの選択基準、ref/ソース管理、テスト/ドキュメント、環境分離の理解が問われます。materialized_viewは「ウェアハウスが差分維持するビュー」であり、dbt自体はETL/ELT実行フレームワークとしてDDLを発行する立場、という役割分担を明確に説明できると有利です。
実務では、スパイク時のクエリ負荷軽減やダッシュボードの安定応答に特に有効です。一方で、自由度の高い変換や非決定的ロジックが必要なときはincremental/tableへ切り替える判断を持っておきましょう。
Analytics Engineer
問題 1
高頻度で参照される日次集計を低レイテンシで提供したい。SQLは決定的で、ウェアハウスがマテビューをサポートしている。dbtで最適なアプローチはどれか?
正解: 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で補完します。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
dbt Model の基礎: SQL で定義する変換の最小単位
Analytics Engineer 向けに、dbt Model の定義、マテリアライゼーション、依存関係、インクリメン...
dbt Analytics Engineer 試験ガイド: 出題範囲・配点・申込の実務視点
dbt Analytics Engineer 認定の出題範囲、配点の考え方、申込から受験までの流れを、公式ドキュメントの...
dbt Cloud と dbt Core の違いと選び方:Analytics Engineer 試験に効く要点
dbt Cloud と dbt Core の機能差を、実務と資格対策の両面から整理。スケジューリング、IDE、RBAC、...
dbt プロジェクト構造ガイド: models / seeds / macros の実務レイアウト
Analytics Engineer 向けに、dbt プロジェクトのディレクトリ構造と命名規約、dbt_project....
dbt_project.yml の読み方:主要設定と命名を最短で掴む
dbt_project.yml の必須キー、命名解決(database.schema.identifier)、設定優先度...