概要
課金方式の選択は損益分岐点で決める
オンデマンドとflat-rateのどちらが安いかは「コストが青天井で不安」という心理ではなく、flat-rate月額 ÷ オンデマンド単価で出る損益分岐スキャン量を実測値と比較して決める。
必要スロット数は実測から逆算する
「100スロットあれば足りるだろう」という当てずっぽうではなく、INFORMATION_SCHEMA.JOBS_BY_PROJECTから実測したピーク同時消費スロット数を基準に必要数を計算する。
課金方式を変える前にスキャン量を削る
SELECT *・パーティションフィルタ欠如は典型的な無駄スキャンの温床。課金方式を変える前に、まず根本原因のクエリ最適化で必要スキャン量そのものを減らせないか検討する。
「今」だけでなく「いつ逆転するか」を試算する
成長トレンド(月次成長率)を使った複利計算で、損益分岐点への到達時期まで試算して初めて「今すぐ切り替えるべきか、様子を見るべきか」を判断できる。
問題
ECサイト MOps チームのシニアエンジニアとして、BigQuery のコスト構造レビューを任された。現在はオンデマンド課金($5/TB スキャン)で運用しているが、後輩エンジニアが「クエリ数が増え続けてコストが青天井なのが不安なので、今すぐ flat-rate(定額)に切り替えるべき」という Bad コスト比較メモを作成し、来週のインフラ定例でこのまま提案する予定だという。
以下の Bad メモから 試算・設計上の問題(7点)を洗い出し、損益分岐点(スキャン量ベース)の計算・実測に基づくスロット容量計画・クエリ最適化案・オンデマンド維持案とflat-rate案の比較・インフラ定例への推奨文までを一気通貫で回答してください。
制約・前提条件
- 料金前提: オンデマンド $5/TB スキャン / flat-rate $1,700/月・100スロット(100スロット単位で追加可能) / 為替 1USD=150円
- dbt Core モデル(Argo Workflows経由、毎晩2:00〜3:30 JSTのバッチウィンドウ内完走がSLA): 45モデルを最大8並列で実行
- うち15モデル(stagingレイヤー、旧パターン)は
SELECT *かつパーティションフィルタなしで月間40TBをスキャン。増分データのみ対象にすれば月間5TBまで削減可能 - 残り30モデルは既に最適化済みで月間80TBをスキャン(削減余地は小さい)
- うち15モデル(stagingレイヤー、旧パターン)は
- アドホックBIダッシュボード(Looker Studio、9-21時に15分間隔更新、12ダッシュボード): mart層(クラスタリング未設定)に対し月間62TBをスキャン
- 月間スキャン量の推移(実測): 3ヶ月前145TB → 2ヶ月前162TB → 直近182TB(月次成長率 約+12%)。直近の月額オンデマンド請求額 = 182TB×$5 = $910/月
- nightly dbtバッチの実測ピーク同時消費スロット数(95パーセンタイル): 240スロット
- エンジニア単価: 80万円/月(20営業日=4万円/人日)。クエリ最適化作業見積もり: 15モデル×0.5人日=7.5人日
悪いコスト比較メモ (Before)
件名: BigQuery flat-rate 移行のご提案
現状: オンデマンド課金($5/TB)
クエリが増え続けており、今後もコストが青天井になる不安がある
← 問題①②③: 損益分岐点未計算・現状の逆転関係見落とし・
成長トレンドを使った到達時期試算なし
改善案: flat-rate($1,700/月・100スロット)へ今すぐ切り替える
月額固定になるので、クエリ数がいくら増えても$1,700/月で
使い放題になり、コストの見通しが立つようになる
← 問題④: 根本原因(非効率クエリ)の最適化を検討せず
課金方式だけで解決しようとしている
← 問題⑤⑥: 100スロットに実測根拠なし、
スロット不足によるバッチSLA違反リスク未検討
よって flat-rate(100スロット)への切り替えを提案します。
← 問題⑦: 単一案のみで代替案との比較なし
ヒント(段階的開示)
ヒント1 — 方向性
ヒント2 — アプローチ
- 問題①: 「今後もコストが青天井になる不安」という主観のみで判断し、損益分岐点($1,700÷$5=340TB/月)を計算していない → まず損益分岐点を出し、現状182TB/月との差を定量化する
- 問題②: 現状の実コスト($910/月)がflat-rateの想定コスト($1,700/月)より既に安いという逆転関係を見落としている → 今切り替えるとむしろ月額が約$790(≒118,500円)値上げになる
- 問題③: 月次+12%という成長トレンドを使った将来予測(何ヶ月後に損益分岐点を超えるか)がなく、「今すぐ」切り替える定量的な根拠がない → 複利成長の式で損益分岐点到達時期を試算する
- 問題④: flat-rateへ切り替えれば解決すると誤認しており、根本原因である非効率クエリ(SELECT *・パーティションフィルタ欠如の15レガシーモデル、月40TB)の最適化を検討していない → 先にスキャン量そのものを削減する選択肢と比較する
- 問題⑤: 「100スロット」という想定がnightly dbtバッチの実測ピーク消費量から逆算されていない → 実測240スロットに対して安全マージンを載せると300スロット($1,700×3=$5,100/月)が必要になり、想定していた$1,700/月では全く足りない
- 問題⑥: スロット不足時のキューイングリスク(クエリがスロット空き待ちになりバッチウィンドウ3:30終了のSLAを守れなくなる可能性)を検討していない
- 問題⑦: flat-rate全面切替という単一案しか比較しておらず、オンデマンド維持+クエリ最適化という代替案とのコスト比較がされていない
ヒント3 — 誘導
【損益分岐点の骨格】
損益分岐スキャン量(TB/月) = flat-rate月額 ÷ オンデマンド単価
100スロット想定(誤り): $1,700 ÷ $5 = 340TB/月
300スロット実測ベース: $5,100 ÷ $5 = 1,020TB/月
【到達時期の骨格(複利成長)】
現在の月間スキャン量 × (1+成長率)^n = 損益分岐スキャン量
n = ln(損益分岐スキャン量 ÷ 現在の月間スキャン量) ÷ ln(1+成長率)
【クエリ最適化後の月間スキャン量】
最適化後 = (現状182TB − レガシー15モデル40TB) + 最適化後レガシー分5TB
= 142TB + 5TB = 147TB/月
問題点分析(7点)
| # | 問題点 | 分類 | 改善方法 |
|---|---|---|---|
| 1 | 損益分岐点を計算せず主観だけで判断 | 試算欠如 | flat-rate月額÷オンデマンド単価で基準値を算出 |
| 2 | 現状$910/月がflat-rate想定$1,700/月より安い逆転を見落とし | コスト比較 | 現行コストとの比較を先に行う |
| 3 | 成長トレンドを用いた到達時期試算がない | 将来予測 | 複利成長式で到達時期を試算 |
| 4 | 根本原因(非効率クエリ)を放置 | クエリ最適化 | SELECT *・パーティションフィルタ欠如を是正 |
| 5 | スロット数に実測根拠がない | 容量計画 | 実測ピーク消費量から必要スロット数を逆算 |
| 6 | スロット不足によるSLA違反リスク未検討 | 運用リスク | キューイング遅延の影響を評価 |
| 7 | 単一案のみで代替案との比較なし | 意思決定プロセス | 現状維持+最適化案との比較を追加 |
損益分岐点比較 — 想定100スロット vs 実測ベース300スロット
模範解答
修正⑤⑥: 実測スロット使用量に基づく必要スロット数の再試算
| 項目 | 値 |
|---|---|
| nightly dbtバッチ ピーク同時消費スロット数(95パーセンタイル実測) | 240スロット |
| 安全マージン(バースト・将来モデル追加分) | +25% |
| 必要スロット数(100単位に切り上げ) | 300スロット |
| Bad案が想定していたスロット数 | 100スロット |
| 不足分 | 200スロット |
| 300スロットのflat-rate月額 | $5,100/月(158.7万円/月) |
修正①②③: 損益分岐点の再計算と到達時期の試算
| 案 | flat-rate月額 | 損益分岐スキャン量(TB/月) | 現状182TB/月との差 |
|---|---|---|---|
| Bad案(想定100スロット) | $1,700 | 340TB | 158TB分の余裕 |
| Good案(実測ベース300スロット) | $5,100 | 1,020TB | 838TB分の余裕 |
到達時期 n = ln(損益分岐スキャン量 ÷ 現状スキャン量) ÷ ln(1+成長率)
最適化前(182TB基準):
n = ln(1,020 ÷ 182) ÷ ln(1.12)
= ln(5.604) ÷ ln(1.12)
= 1.723 ÷ 0.1133 ≒ 約15.2ヶ月後
最適化後(147TB基準):
n = ln(1,020 ÷ 147) ÷ ln(1.12)
= ln(6.939) ÷ ln(1.12)
= 1.937 ÷ 0.1133 ≒ 約17.1ヶ月後
修正④: クエリ最適化によるスキャン量削減試算とROI
| 項目 | 現状 | 最適化後 |
|---|---|---|
| レガシー15モデルのスキャン量 | 40TB/月 | 5TB/月 |
| 最適化済み30モデル | 80TB/月 | 80TB/月(変更なし) |
| BIダッシュボード(今回対象外) | 62TB/月 | 62TB/月 |
| 月間合計スキャン量 | 182TB/月 | 147TB/月 |
| 月額オンデマンドコスト | $910 | $735 |
- 月次削減額: $910 − $735 = $175/月(26,250円/月)
- 最適化作業コスト: 7.5人日 × 4万円/人日 = 30万円
- 直接削減効果だけのペイバック期間: 300,000円 ÷ 26,250円/月 ≒ 11.4ヶ月(地味)
現状維持・Bad案・Good案の比較
| 案 | 月額 | 根拠 | 判定 |
|---|---|---|---|
| 現状維持(オンデマンド、最適化なし) | $910 | 182TB×$5 | 現時点では最安 |
| Bad案(flat-rate 100スロット、即時切替) | $1,700 + SLA違反リスク | 実測の裏付けなし | 値上げ+運用リスクの二重苦 |
| 実測ベースflat-rate(300スロット、即時切替) | $5,100 | 実測240スロット+マージン | 過剰投資(損益分岐点に遠い) |
| Good案(クエリ最適化+オンデマンド継続) | $735 | 147TB×$5 | 現時点で最安、将来の必要スロットも圧縮 |
インフラ定例への推奨文
flat-rate(100スロット、$1,700/月)への即時切替は、実測データに
基づかない試算です。オンデマンドの現行コストは$910/月であり、
切り替えるとむしろ月額が上がります。また、nightly dbtバッチの
実測ピークスロット消費量(240スロット)から必要スロット数を
計算すると、実際には300スロット($5,100/月)が必要であり、
想定していた100スロットではバッチSLA(3:30終了)を守れない
リスクがあります。
損益分岐点は実測ベースで1,020TB/月であり、現状182TB/月・
成長率+12%/月でも到達には約15ヶ月かかります。まずは
SELECT *とパーティションフィルタ欠如が残る15のレガシー
stagingモデルを最適化し(工数7.5人日)、月間スキャン量を
147TBまで削減することを推奨します。これにより月額コストを
$910から$735に抑えつつ、将来flat-rateへ移行する際の
必要スロット数(延いてはコスト)自体を圧縮できます。
flat-rateへの切替は、実測スロット使用量とスキャン量の成長
トレンドを継続的にモニタリングし、必要性が定量的に裏付け
られた時点で再検討します。
ポイント解説
INFORMATION_SCHEMA.JOBS_BY_PROJECTのようなメタデータテーブルで実際のスロット消費を測定せずに容量を決めると、コスト超過とキャパシティ不足(SLA違反)の両方のリスクを抱える。実務への応用
MOpsチームのようにdbtバッチとBIダッシュボードの両方でBigQueryを使うチームでは、「クエリ数・データ量が増えてきたので定額プランへ」という発想に流れやすい。しかし実務では、コスト増加の内訳(バッチの非効率クエリなのか、BIの高頻度アクセスなのか)を分解し、根本原因に手を打ってから課金方式の見直しを検討する順序が重要になる。INFORMATION_SCHEMAベースでスロット使用量・スキャン量を継続的にモニタリングする仕組みをdbtパイプラインやDataDogダッシュボードに組み込んでおけば、「切り替えるべきタイミング」を勘ではなく数字で判断できるようになる。
今日のまとめ
次のステップ
- 発展問題: クエリ最適化実施から6ヶ月後、月間スキャン量が想定(147TB×1.12^6≒290TB)よりも早いペースで損益分岐点(1,020TB/月)の半分の水準に達し、BIダッシュボードの新規追加(マーケティング部門から月10件のペースで依頼)が主因と判明した。このとき、(1)flat-rateへの切替を前倒しすべきか、(2)BI Engineでダッシュボード側のスキャンをキャッシュ化してオンデマンドを維持すべきかを、それぞれのコスト構造(固定費化 vs キャッシュ容量課金)を比較した上で判断せよ。
- 参考: BigQuery オンデマンド課金 / flat-rate(スロット予約) / INFORMATION_SCHEMA.JOBS_BY_PROJECT / パーティションフィルタ / クラスタリング / BI Engine / 損益分岐点分析