dbt Core/Cloudの選択子(selector)は、対象ノードを最小限に絞り込み、速く安全にパイプラインを回すための中核機能です。
本稿では、試験でも問われやすく、実務でも多用される tag / path / +(model+の意) / state: を、誤解しがちなポイントとともに整理します。
dbtのコマンド(run/build/test/seedなど)は --select と --exclude で対象ノードを指定します。選択方法は複数あり、代表例は tag:, path:, state:, リソース種別(model/test/seed/source など)、および系統展開の + です。ここでの + は「親(上流)/子(下流)の包含」を意味し、model+ という表現は my_model+(下流まで)や +my_model(上流まで)の総称としてよく言われます。
各セレクタは単独でも有用ですが、組み合わせることで CI の高速化、段階的リリース、夜間バッチなどを安全に実行できます。特に state: は過去のアーティファクト(manifest.json)と比較して差分だけを動かせるため、運用規模が大きいほど効果が出ます。
| 選択子/機能 | 主な用途 | 典型例 | 利点 |
|---|---|---|---|
| tag: | 論理グルーピング(夜間/重い/部門別など) | dbt build --select tag:nightly | コード配置と無関係に柔軟に束ねられる |
| path: | ディレクトリ/ファイル単位の選択 | dbt run --select path:models/staging/ | 物理配置に沿った明快な選択 |
| +(系統展開) | 上流/下流も含めて安全に再実行 | dbt build --select +fact_orders | 依存関係を取りこぼさない |
| state: | 差分実行(変更/新規) | dbt build --select state:modified+ --state target/ | 巨大リポでも高速化しやすい |
+(系統展開)の概念図
Upstream Target Downstream
A ----> B ----> C ----> D
^
|__ 選択対象: B
+B => A, B (Bとすべての上流)
B+ => B, C, D (Bとすべての下流)
+B+ => A, B, C, D (上下流をすべて含む)基本的な使い方(例)
### セレクタの基本
# タグで選択
dbt build --select tag:nightly
# パスで選択(プロジェクトルートからの相対)
dbt run --select path:models/marts/
# 系統展開(上下流)
dbt build --select +dim_customers
dbt build --select fact_orders+
dbt build --select +stg_payments+
# state:(差分)
dbt build --select state:modified+ --state path/to/previous/target --defertag: はモデルやスナップショット、シード、(必要なら)テストなどに付与して、論理的な束ねを実現します。物理パスに依存しないため、組織や運用ポリシーに沿った単位(nightly/heavy/finance など)で安全に回せます。
dbt build は、選択したモデルに依存するテストも自動的に実行します。テスト自体にタグを付けたい場合は、schema/properties YAML 側で tests 定義に tags を設定します。
タグ付与と実行の例
-- models/marts/fact_orders.sql
{{ config(tags=["nightly", "heavy"]) }}
select ...
# schema.yml でテストにタグを付与する例
models:
- name: fact_orders
tests:
- not_null:
column_name: order_id
tags: ["heavy"]
# タグでビルド
dbt build --select tag:nightly
# 特定タグを除外
dbt build --select tag:nightly --exclude tag:heavypath: はプロジェクトルートからの相対パスでノードを指定します。ディレクトリを指すと配下のノードが対象になり、ファイルを指すと当該ノードのみが対象になります。モデル配置ポリシー(staging/marts など)が明確な場合にシンプルで強力です。
外部パッケージのノードを狙う場合、プロジェクトの packages/ 以下を指すか、package: セレクタの利用も検討してください。ファイル移動やリネームを行うと選択範囲が変わるため、レビューでの確認が有効です。
path: の例
# ステージング配下のみ
dbt run --select path:models/staging/
# 単一ファイルをピンポイント実行
dbt run --select path:models/marts/fact_orders.sql
# 外部パッケージ(例: jaws_shop)配下(必要なら)
dbt build --select path:packages/jaws_shop/models/+ は選択範囲に上下流の系統を含めるための演算子です。+target は上流(parents)、target+ は下流(children)、+target+ は上下流の両方を含みます。ビルドやリファクタ時に取りこぼしを防ぐための必須テクニックです。
dbt build と組み合わせると、モデルに紐づくテストも適切に実行されます。影響範囲が広がり過ぎる場合は、--exclude と併用して調整します。
+ の活用例
# 影響する下流まで一気に検証
dbt build --select stg_payments+
# 上流の前処理も含めて再計算
dbt build --select +fact_orders
# 上下流すべて(大規模になる可能性があるので注意)
dbt build --select +dim_customers+ --exclude tag:heavystate: は過去のアーティファクト(通常は target/manifest.json)と現在のリポジトリ状態を比較し、変更(modified)や新規(new)になったノードだけを選択する仕組みです。--state で参照先ディレクトリを指定するのが前提です。運用では、本番ビルド成果を --state に渡し、--defer を併用して未変更部分を既存成果に委譲する使い方が定番です。
よく使うパターンは state:modified+(変更ノードとその下流)や state:new(新規ノードのみ)です。ファイル移動や名称変更、config の重要な差分(materialized など)も変更として扱われます。
state: の実例
# 変更ノードとその下流のみをビルド
dbt build --select state:modified+ \
--state s3://prod-artifacts/jaffle/target \
--defer
# 新規ノードだけ検証(機能追加のスモークテストなど)
dbt build --select state:new --state ./target-prod --defer
# 変更ノードのみテスト(モデルは既存成果に委譲)
dbt test --select state:modified --state ./target-prod --defer実務では、物理配置(path:)・論理(tag:)・系統(+)・差分(state:)を組み合わせて「最小で十分」な範囲を狙います。Analytics Engineer 試験でも、この発想とコマンドの正確さが問われます。
よくある落とし穴は、タグ付けの不統一、path: の移動影響見落とし、+ による広範囲選択、state: 利用時の --state/--defer 指定漏れです。安全側に倒すなら build と + を優先し、過大選択は --exclude で抑えます。
組み合わせの例
# 夜間ジョブ(論理 + 除外)
dbt build --select tag:nightly --exclude tag:heavy
# ステージング検証(物理 + 下流)
dbt build --select path:models/staging/+
# 本番差分(state: + 下流 + defer)
dbt build --select state:modified+ --state s3://prod/target --defer
# レガシーを除外しつつ影響範囲を検証
dbt build --select +fact_orders --exclude path:models/legacy/Analytics Engineer
問題 1
本番で生成済みの manifest.json を参照し、変更のあったモデルとその下流だけを安全に検証したい。最も適切なコマンドはどれか。
正解: A
差分指定には --state が必須で、変更ノードの下流も含めるには state:modified+ が適切。--defer を併用すると未変更ノードは既存成果に委譲され安全。B は --state がなく不十分、C は新規のみかつ --state 不足、D は差分になっていない。
state:modified と state:new の違いは?
state:modified は既存ノードで内容や重要な設定が変わったもの、state:new は新規に追加されたノードを指します。どちらも --state で比較先のアーティファクト(manifest.json)を指定する必要があります。
path: と fqn: はどう使い分けますか?
path: はファイル/ディレクトリの物理パス基準、fqn: はプロジェクト名・サブディレクトリ・モデル名の論理的な完全修飾名基準です。ディレクトリ整理が効いているなら path: が直感的、論理階層を維持したい場合は fqn: も選択肢になります。
タグはテストにも効きますか?
テスト自体に tags を付与すれば tag: で直接選択できます。付与しなくても dbt build は選択されたモデルに紐づくテストを実行します。明示的にテストを束ねたい場合は、schema/properties YAML 側で tests に tags を設定してください。
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)、設定優先度...