dbt

dbtのviewマテリアライゼーション徹底整理: 軽量な論理変換の最適解

2026-04-19
NicheeLab編集部

dbtにおけるviewマテリアライゼーションは、ストレージを消費せずに論理変換レイヤを素早く提供できる選択肢です。毎回のクエリ時に再計算されるため、軽量な整形・正規化・列名変更・型変換に適します。

本稿は、dbtの公式ドキュメントに基づく安定した挙動を前提に、試験で問われやすい知識と現場運用の要点を整理します。Snowflake/BigQuery/Redshift/Databricksなど主要DWHでの一般的な注意点もあわせて解説します。

viewマテリアライゼーションの基礎

dbtモデルをmaterialized: viewにすると、アダプタ固有の方言でCREATE VIEW(多くの環境ではCREATE OR REPLACE VIEW)として定義されます。データは保存されず、参照時に都度クエリが実行されます。モデルのデフォルトはviewである点も試験で頻出です。

dbtは依存関係をref/sourceで解決し、ビルド順序を制御します。viewは再作成時に定義が置き換わるため、コード変更の反映が早い一方、下流の依存クエリコストは元テーブルのスキャン量に依存します。権限やコメントの保持可否はアダプタ依存のため、grants/persist_docsを使って明示的に付与・反映する運用が安全です。

  • 保存容量は実質ゼロ。クエリ時に計算コストが発生
  • 軽量な整形・正規化・列名変更・型変換・軽いフィルタに最適
  • 重い集計や頻出アクセスには不向き(後述のアンチパターン参照)
  • 多くのアダプタでCREATE OR REPLACE相当。動作は方言に依存

最小構成のviewモデル(models/stg_orders.sql)

{{ config(
    materialized='view',
    alias='stg_orders',
    schema='staging'
) }}

select
  cast(id as string)       as order_id,
  cast(customer_id as int) as customer_id,
  order_date,
  status
from {{ source('raw', 'orders') }}

コスト特性と他マテリアライゼーション比較

viewはビルド時にストレージを増やさない一方、参照するたびに基盤側で再計算されます。Snowflakeならコンピュートクレジット、BigQueryならスキャンバイト、Databricksならクラスタ時間が主なコスト源です。軽量変換であれば、変換をviewに任せて下流テーブルでのみ永続化する分離がコスト最適になりやすいです。

重い結合や大規模集計が頻繁に発生する場合は、tableやincrementalでの永続化を検討します。ephemeralは上流にインライン展開されるためDBオブジェクトは作られず、デバッグや権限付与の観点ではviewのほうが扱いやすいことがあります。

  • viewはクエリ単価を押さえる設計(列削減・前段のフィルタ)と併用する
  • table/incrementalはストレージを使ってクエリ時間を短縮するトレードオフ
  • ephemeralはデバッグ容易性や権限管理で制約がある点に注意
マテリアライゼーション実体更新タイミングストレージ
viewデータ未保存(ビュー定義)参照時に再計算ほぼ0
tableテーブルに保存dbt実行時に全再計算中〜大
incrementalテーブルに差分追加差分計算時のみ中〜大(差分蓄積)
ephemeralDBオブジェクトなし(CTE展開)コンパイル時に上流へインライン0

dbt_project.ymlで階層ごとにデフォルトを切り替える例

models:
  staging:
    +materialized: view
    +tags: [staging]
  marts:
    +materialized: table
    +tags: [marts]

実務パターン: 軽量な論理変換レイヤの組み方

ソース直後のstaging層をviewで統一し、列名の正規化・型変換・単純フィルタで下流のモデルを安定化させます。重い結合やウィンドウ集計はmarts層でtable/incrementalに任せると、クエリコストの集中を避けられます。

権限周りでは、dbtのgrants設定で参照ロールを自動付与します。Snowflakeではアダプタ固有設定でSECURE VIEWが選べます。BigQueryのAuthorized ViewやDatabricksのUnity Catalog権限は、ビュー作成後の権限付与運用と組み合わせるのが一般的です。

  • stagingはview、martsはtable/incrementalというレイヤ分離
  • viewで列命名規約・型をそろえ、テストを安定化
  • 権限はdbtのgrantsで自動適用(アダプタ依存の差に注意)

軽量変換レイヤとしてのview配置

dbt run/testraw.ordersraw.customersstg_orders(view)dim_customer(table)fct_sales(incremental)軽量変換レイヤとしてのview配置

staging層の軽量整形ビュー(models/stg_customers.sql)

{{ config(materialized='view', alias='stg_customers') }}

select
  cast(c.customer_id as int)        as customer_id,
  trim(lower(c.email))              as email_normalized,
  coalesce(nullif(c.country, ''), 'UNKNOWN') as country,
  c.created_at
from {{ source('raw', 'customers') }} c
where c.is_deleted = false

向いていないケースと注意点(アンチパターン)

ビューは毎回再計算されるため、重い結合・大規模集計・高頻度アクセスではコストや待ち時間が蓄積します。こうしたケースはtableやincrementalに切り替え、必要ならクラスタリングやソートキー、Z-ORDER(環境により異なる)などテーブル側の最適化を検討します。

dbtのviewは各DWHの“マテリアライズド・ビュー”とは別物です。dbtのmaterialized: viewは通常のビュー定義であり、ストレージに結果を保持しません。マテリアライズド・ビュー機能を使う場合は、アダプタや運用ポリシーに沿った別途の実装/管理が必要です。

  • 重い集計・多段結合・高頻度参照はtable/incrementalへ
  • インデックスやテーブル固有の物理最適化はビューでは付与不可(基盤側の機能に依存)
  • “dbtのview”と“DWHのマテリアライズド・ビュー”は混同しない

重い処理はtable/incrementalへ切替(models/agg_sales.sql)

{{ config(
  materialized='incremental',
  unique_key='order_id',
  incremental_strategy='insert_overwrite'
) }}

with base as (
  select * from {{ ref('stg_orders') }}
)
select
  order_id,
  date_trunc('day', order_date) as order_day,
  count(*) as order_cnt
from base
{% if is_incremental() %}
  where order_date >= dateadd('day', -7, current_date)
{% endif %}
group by 1,2

運用の実際: リビルド、権限、スキーマ変更

多くのアダプタでビューはCREATE OR REPLACEとして再定義されます。列追加や式変更は即時に反映されますが、下流が特定列に依存していると破壊的変更で失敗します。破壊的変更はキュレーション、タグ付け、prチェックとdbt testで早期検知しましょう。

権限やコメントの保持は挙動が環境依存です。dbtのgrantsとpersist_docs(アダプタ対応状況に依存)を設定し、ビルド後に確実に適用する運用が安全です。SnowflakeのSECURE VIEWなど、アダプタ固有オプションは該当環境のドキュメントに従ってください。

  • 破壊的スキーマ変更はPRレビューとdbt testで検出
  • grants/persist_docsを使い、再作成時にも権限・コメントを明示適用
  • 本番はタグや環境変数で選択的にビルド(-s/-m セレクタ)

ビューでの権限とドキュメント反映(dbt_project.yml 抜粋)

models:
  staging:
    +materialized: view
    +grants:
      select: ['ANALYST_ROLE']
    +persist_docs:
      relation: true
      columns: true

試験対策チェックポイントとミニ演習

押さえる: 1) dbtモデルのデフォルトはview、2) viewは都度再計算で軽量変換に適する、3) 重い処理や高頻度参照はtable/incremental、4) ephemeralはDBオブジェクトを作らない、5) grants/persist_docsはアダプタ対応に依存、6) dbtのviewはDWHのマテリアライズド・ビューとは別。

演習: stagingをview、martsをtableに分離し、dbt testでstagingのスキーマを固定化。高コストな下流クエリがある場合は実行計画やスキャン量を見ながらmartsをincrementalへ切替える判断基準をメモ化しておくと現場と試験の両方で役立ちます。

  • 選択子: dbt run -s tag:staging でviewのみを先に検証
  • 契約テスト: not_null/uniqueでstagingの品質を担保
  • コスト監視: DWHごとのメトリクスでスキャン量を可視化

CLI例(選択実行とテスト)

# stagingのviewだけビルド
$ dbt run -s tag:staging

# 下流のmartsのみ再ビルド
$ dbt run -s tag:marts

# 重要カラムのテストを実行
$ dbt test -m stg_orders stg_customers

問題で確認

Analytics Engineer

問題 1

頻繁に参照されるソーステーブルに対して、列名の正規化と軽いフィルタだけを行い、ストレージ増加を避けたい。下流では重い集計を別途テーブルとして永続化する計画。このときstagingモデルの最適なdbtマテリアライゼーションはどれか?

  1. A. view
  2. B. table(常にフルリフレッシュ)
  3. C. incremental
  4. D. ephemeral

正解: A

軽量な変換でストレージを増やさず、定義変更の反映を即時にしたい場合はviewが最適。table/incrementalはストレージを消費し、ephemeralはDBオブジェクトを作らないため権限付与や独立参照が難しい。

よくある質問

viewは毎回再計算されるの?キャッシュは効く?

はい。ビュー自体は結果を保持しません。DWH側のクエリキャッシュや結果キャッシュが効く場合は再計算が短縮されることがありますが、保証や保持条件は各DWH実装に依存します。基本は再計算前提で設計します。

viewにインデックスやクラスタリングを設定できる?

一般にビューには直接設定できません。物理最適化は基となるテーブルや、テーブルとして永続化したモデルで行います。高頻度かつ重い処理はtable/incrementalへの切替を検討してください。

SnowflakeのSECURE VIEWやBigQueryのAuthorized Viewはdbtで扱える?

SnowflakeアダプタではconfigでSECURE VIEWの作成をサポートします(環境権限に依存)。BigQueryのAuthorized Viewはデータセット権限設定の運用が必要で、ビュー作成後に適切な権限を付与します。細部は各公式ドキュメントに従ってください。

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

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の記事一覧 (101件)
© 2026 NicheeLab All rights reserved.