ふくふくHukuhuku Inc.
EP.15dbt 13分公開: 2026-05-10

アンチパターン10選:現場で本当に困る dbt の落とし穴

受託案件で繰り返し見てきた失敗 10 個。「全モデル table」「dbt おじさん化」「テスト 0 個」「source 直参照」「macro 過剰」など。それぞれの再現状況・気づくシグナル・処方箋を。

#dbt#アンチパターン#失敗事例
シェア

を導入した組織で 1 年後によく見る失敗パターンを 10 個。それぞれ「こうなったら危険」というシグナルと処方箋セットで。

AP1: 全モデルが table materialization

症状

model 数 500 で `dbt run` が 2 時間。 月額が想定の 5 倍。staging も全部 table、誰も再考していない。

処方箋: staging は view、intermediate は ephemeral or view、marts のうち重いものだけ table か incremental (EP.05)。

AP2: source() を staging 以外で使う

症状

marts や intermediate で `source('raw', 'orders')` を直接使っている model が複数。同じソーステーブルから複数の型変換が走り、結果が食い違う。

処方箋: 1 source = 1 staging model = この staging を `ref()` でしか参照しない。CI で `dbt run-operation` を書いて違反を弾く。

AP3: テスト 0 個で本番運用

症状

`dbt test` でテスト 3 件 (全部 stg__customers の unique のみ)。本番で 顧客重複・FK 不整合・NULL 流入 が頻発。

処方箋: 全 model の主キーに `unique + not_null` 必須化を CI で。最低限 EP.06 の 4 種を組込み、リリース前に 0 件は弾く。

AP4: dbt おじさん化 (1 人依存)

症状

dbt の事は田中さんに」が定型句。田中さんが休むと PR レビューが止まる。スキーマ変更の影響範囲を聞ける人が 1 人。

処方箋: schema.yml に owner を明記 (EP.07)、Group 制度で複数人 owner (EP.13)、ペアレビューを必須化、月 1 のナレッジ共有会。

AP5: depth 10 のモデル依存チェーン

症状

lineage グラフで「`stg → int → int → int → fct → fct → fct → mart`」のような長鎖。1 個のスキーマ変更で 7 段のリビルドが必要、CI が 30 分かかる。

処方箋: intermediate を 1 段に抑える、共通計算は ephemeral or -friendly な関数化。深さは `dbt list --select +model_x` で測れる。

AP6: incremental の WHERE 抜け漏れ

症状

incremental だが過去の遅延到着分を再取り込みしていない。月末に「先月分の data が 5% 抜けている」事件発生。

処方箋: WHERE で `MAX(occurred_at) - 24h` のオーバーラップを入れる (EP.11 incremental 編で深掘り予定)。月 1 で `--full-refresh` を強制実行。

AP7: macro 過剰で が読めない

症状

1 model に macro が 8 個展開、Jinja の方が SQL より長い。新人がレビューで何が起きるか分からない。

処方箋: macro は 3 回以上同じパターンが出てから作る。1 model に 3 個まで、複雑な model は plain SQL のまま読みやすく。

AP8: 環境分離なし (`dev` で `prod` を直接触る)

症状

個人の dev 環境が prod と同じスキーマ。手元の `dbt run` で本番テーブルを書き換え て事故。

処方箋: profiles.yml で `dev/ci/prod` を必ず分離 (EP.02)、prod は service account 限定、人手で叩けないよう CI 経由のみ。

AP9: dbt docs を生成しない / 公開しない

症状

`dbt docs generate` を見たことがない。schema.yml の description が空欄だらけ。non-engineer から「これって何のテーブル?」が止まらない。

処方箋: CI で description coverage を必須化 (EP.07)、weekly で `dbt docs generate` し社内に公開、未記入は PR を block。

AP10: コスト無関心

症状

BigQuery 月額が前月比 +200%。誰の model が高いか追えていない。dbt run の bytes_billed を見たことがない。

処方箋: `INFORMATION_SCHEMA.JOBS_*` を別 model で集計、model 別の月次コストダッシュを作る。閾値超過で Slack 通知。`maximum_bytes_billed` をデフォルト設定。

ふくふくの『監査チェックリスト』

受託先の dbt プロジェクト診断時に使うチェックリスト。1 つでも No なら改善余地あり。

  1. 1全 model の主キーに `unique + not_null` テスト ✅?
  2. 2全 source に `freshness` 設定 ✅?
  3. 3staging が view、marts が table or incremental の方針 ✅?
  4. 4depth が 5 段以下に保たれている ✅?
  5. 5schema.yml の description coverage 80% 以上 ✅?
  6. 6PR で Slim CI が走り、変更モデル + 下流をビルド ✅?
  7. 7PR ごとに隔離スキーマ ✅?
  8. 8月 1 で `--full-refresh` を実行 ✅?
  9. 9model 別コスト集計をダッシュ化 ✅?
  10. 10owner が schema.yml に明記 ✅?

ここまでのまとめ

本シリーズ EP.01〜15 で の入門から本番運用まで一巡しました。続編は読者リアクションに応じて、dbt + 統合dbt + Icebergdbt 多テナント運用生成 による model 自動生成などのテーマで随時追加していきます。

シェア

この記事の感想を教えてください

あなたの 1 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。

シリーズの外も探す:

まずは、現状を聞かせてください。

要件が固まっていなくて大丈夫です。現状診断と方針提案までを無料でお手伝いします。

無料相談フォームへ hello [at] hukuhuku [dot] co [dot] jp