dbt build はモデル・シード・スナップショットを構築し、その結果に対するテストを依存順にまとめて実行します。個別に dbt run → dbt test → dbt snapshot を分けるより、パイプラインを壊しにくく CI に載せやすいのが利点です。
本稿は dbt 公式ドキュメントの安定機能を前提に、Analytics Engineer 試験で問われやすい比較観点(run/test/snapshot と build の違い、セレクタ、state/defer)を実務目線で整理します。
dbt build は選択されたリソース(models、seeds、snapshots)を DAG に沿って構築し、完了後に tests(generic/singular)を実行します。依存関係が満たされていないテストは自動的にスキップされ、失敗した上流ノードにぶら下がるテストも走りません。
ポイントは順序制御と原子性です。単一コマンドで「構築→検証」までを一気通貫に回すため、個別コマンドの順序ミスや取りこぼしを防げます。CI では build を既定のエントリポイントにすると運用が安定します。
| コマンド | 主な対象/役割 | 実行内容 | dbt build での扱い |
|---|---|---|---|
| dbt run | models(materialization) | モデルSQLを実行しテーブル/ビュー/インクリメンタルを更新 | build 内で実行される(tests の前) |
| dbt test | generic/singular tests | unique/not_null/関数テストなどでデータ品質を検証 | build の最後にまとめて実行 |
| dbt snapshot | snapshots | SCD 用スナップショットテーブルを更新 | build 内で実行される(tests の前) |
| dbt seed | seeds(CSV ロード) | CSV をターゲットDBにロード | build 内で実行される(tests の前) |
| dbt build | 上記の統合 | DAG順に構築 → その結果に対して tests | 本稿の主役。CI のデフォルトに適する |
dbt build の実行フロー(概念図)
最小の実行例
dbt build
# profiles.yml と dbt_project.yml が設定済みであれば、この1行で
# models/seeds/snapshots を構築し、最後に tests を実行します。dbt build は選択済みノードの DAG を解決し、models/seeds/snapshots を先に構築します。tests は常にその後で、親ノード(対象テーブル/ビュー/スナップショット/シード)が成功している場合のみ実行されます。ephemeral モデルは物理化されず、親クエリへインライン展開されます。
インクリメンタルモデルは既定で差分更新、--full-refresh を付けた場合は再作成します。tests は更新後の状態に対して走るため、品質検証は常に最新の構築結果に対して行われます。
順序を意識した基本(何も指定しない)
dbt build
# DAG に基づいて seeds/models/snapshots → tests の順で動くdbt build は --select/--exclude で柔軟に範囲指定できます。タグ、ファイルパス、モデル名、リソースタイプ(model:, snapshot:, seed:, test:)に加えて、state:modified などの状態セレクタも利用可能です。末尾に + を付けると子孫、先頭に + を付けると祖先を含めます。
大規模リポジトリでは、タグやパス、リソースタイプを組み合わせて対象を最小化すると CI 実行時間を短縮できます。
代表的なセレクタ例
# 重要タグのモデルとその子孫だけを構築し、最後に tests
dbt build --select tag:critical+
# スナップショットだけを更新し、関連 tests のみ実行
dbt build --select snapshot:
# マート配下と依存元(祖先)を含めて構築
dbt build --select +path:models/marts/
# 変更点とその下流のみ(state ディレクトリの指定は別途)
dbt build --select state:modified+ --state target/dbt build はスレッド数に応じて独立ノードを並列実行します。あるノードが失敗した場合、そのノードに依存する下流ノードと紐づく tests はスキップされます。--fail-fast を付けると最初の失敗で全体を停止します。
分岐が多い DAG では --threads を適切に設定して全体時間を短縮しつつ、クリティカルな検証では --fail-fast を使って早期に失敗を検知するのが実務的です。
並列と早期失敗
# 8 並列で実行し、最初の失敗で停止
dbt build --threads 8 --fail-fast差分ビルドの定番は、プロダクションのアーティファクト(manifest.json など)を --state で参照し、変更のあったノードとその下流だけを --select state:modified+ で選ぶパターンです。さらに --defer を併用すると、未選択の上流 ref はプロダクションの構築物に委譲されるため、CI で最小限の構築に抑えられます。
この組み合わせは PR 単位の検証時間を大幅に短縮できます。プロダクション側のアーティファクトは本番ジョブで都度出力し、CI から参照するように整備します。
典型的な CI コマンド
# プロダクションのアーティファクトを参照し、変更点とその下流のみを検証
# artifacts/ に本番の manifest.json 等がある前提
dbt build --select state:modified+ --state artifacts/ --deferdbt build は強力ですが、インクリメンタルモデルのフルリフレッシュや大量スナップショットを無闇に混ぜると時間・コストが膨らみます。CI では差分とテスト重視、本番ではスケジュールとワークロード分離が有効です。
品質面では critical なテストに severity:error、補助的なものに severity:warn を使い分け、store_failures で失敗行を収集すると改善サイクルが回しやすくなります。
スキーマテストの設定例(fail を収集)
version: 2
models:
- name: orders
columns:
- name: id
tests:
- unique:
severity: error
store_failures: true
- not_null:
severity: errorAnalytics Engineer
問題 1
Analytics Engineer として PR 検証の高速化が課題です。プロダクションの成果物(manifest.json)を参照しつつ、変更のあったモデルとその下流のみを構築・検証したい。最も適切なコマンドはどれか?
正解: A
state:modified+ で変更ノードと下流を選択し、--state でプロダクションのアーティファクトを参照、--defer で未選択の上流参照を本番成果物に委譲するのが定石。B は run/test 分離で順序ミスや選択漏れのリスクがある。C の tag:modified は意図と異なる。D は snapshot 単独で build ではない。
dbt build は exposures や source freshness も実行しますか?
いいえ。build が対象にするのは models、seeds、snapshots と tests です。exposures はメタ情報、source freshness は dbt source freshness で個別に実行します。
dbt build と dbt run → dbt test を分けて実行する違いは?
build は DAG に沿って構築し、その結果に対して tests を必ず最後に実行します。個別実行は順序や選択の不整合が起きやすく、CI では build を使う方が安全です。
スナップショットを含むジョブが重くなります。対策は?
タグ/パスでスナップショットを分離し、定期バッチと PR 検証を分けます。PR は state:modified+ と --defer を用いて差分のみ実行し、大規模スナップショットは本番スケジュールで回すのが現実的です。
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)、設定優先度...