E 会計/ファイナンス・コスト効率 — BigQuery オンデマンド vs flat-rate 損益分岐点 Bad→Good(「コストが青天井で不安」で損益分岐点未計算 × 実測ピークスロット消費(240)から必要スロットを逆算すると300スロット=$5,100/月 × 損益分岐点は340TB/月ではなく1,020TB/月 × SELECT *・パーティションフィルタ欠如15モデルの最適化で147TB/月に削減 × スロット不足によるバッチSLA違反リスク)(MOps 販促システムチーム dbt Core 45モデル/Argo Workflows/BigQuery Bad→Good 7点)

2026-08-21 (Day 137) 金曜 E: 会計/ファイナンス・コスト効率 ★★★★☆ BigQuery flat-rate / 損益分岐点 スロット容量計画 / クエリ最適化

概要

⚖️

課金方式の選択は損益分岐点で決める

オンデマンドと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をスキャン(削減余地は小さい)
  • アドホック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人日
期待する回答形式: 問題点の列挙(番号付き) + 実測スロット使用量に基づくflat-rate必要スロット数の再試算 + 損益分岐点(スキャン量ベース)の計算と到達時期の試算 + クエリ最適化によるスキャン量削減試算とROI + 現状維持・Bad案・Good案の比較 + インフラ定例への推奨文

悪いコスト比較メモ (Before)

このメモには 7つの問題 が隠れています。見つけてみてください。
Bad メモ — 損益分岐点未計算、スロット数は当てずっぽう
件名: BigQuery flat-rate 移行のご提案

現状: オンデマンド課金($5/TB)
  クエリが増え続けており、今後もコストが青天井になる不安がある
← 問題①②③: 損益分岐点未計算・現状の逆転関係見落とし・
   成長トレンドを使った到達時期試算なし

改善案: flat-rate($1,700/月・100スロット)へ今すぐ切り替える
  月額固定になるので、クエリ数がいくら増えても$1,700/月で
  使い放題になり、コストの見通しが立つようになる
← 問題④: 根本原因(非効率クエリ)の最適化を検討せず
   課金方式だけで解決しようとしている
← 問題⑤⑥: 100スロットに実測根拠なし、
   スロット不足によるバッチSLA違反リスク未検討

よって flat-rate(100スロット)への切り替えを提案します。
← 問題⑦: 単一案のみで代替案との比較なし
問題点サマリー(7点)
1損益分岐点を計算せず「不安」だけで判断 — $1,700÷$5=340TB/月という基準値がない
2現状$910/月がflat-rate想定$1,700/月より既に安い逆転を見落とし — 今切替は値上げ
3成長率+12%/月を使った到達時期試算なし — 「今すぐ」の根拠が無い
4根本原因(非効率クエリ)を放置 — SELECT *・パーティションフィルタ欠如15モデル月40TB
5100スロットに実測根拠なし — 実測ピーク240スロットから300スロット=$5,100/月が正解
6スロット不足によるバッチSLA違反リスク未検討 — 3:30終了を守れない可能性
7flat-rate全面切替のみで代替案との比較なし — オンデマンド維持+クエリ最適化を未検討

ヒント(段階的開示)

ヒント1 — 方向性
Bad メモの罠は3系統。(1) 損益分岐点を計算せず「不安」という主観だけで判断している — オンデマンドとflat-rateのどちらが安いかは、月間スキャン量が「損益分岐点($1,700÷$5/TB=340TB/月)」を超えるかどうかで決まる定量的な問題であり、現状182TB/月はまだ大きく下回っている。(2)「100スロット」という数字に何の根拠もない — flat-rateで実際にいくつのスロットが必要かは、nightly dbtバッチのピーク同時実行に伴う実測スロット消費量から逆算すべきであり、当てずっぽうの数字で切り替えると容量不足でバッチSLAを守れなくなるリスクがある。(3) flat-rateへの切り替えという単一の解決策しか検討しておらず、根本原因であるクエリの非効率(SELECT *・パーティションフィルタ欠如)に手を付けていない — コスト構造を変える前に、そもそものスキャン量そのものを削減できないかを先に検討すべき。
ヒント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スロット

Bad — 想定100スロットで即時切替 flat-rate 100スロット = $1,700/月 問題⑤: 実測ピーク240スロットへの裏付けが無い数字 損益分岐点(誤): 340TB/月 問題①②: 現状182TB・現行コスト$910より高い誤算 実際は月$790の値上げ + 容量不足 実測240スロット > 想定100スロット 問題⑥: nightlyバッチがスロット待ちでキューイング バッチSLA(3:30終了)違反リスク 45モデルの依存関係次第で遅延が累積 SELECT *・パーティションフィルタ欠如を放置 問題④: 根本原因のスキャン量(40TB/月)が残ったまま × 値上げなのに「コスト見通しが立つ」と誤認 × 容量不足でバッチSLA違反のリスクを内包 × 根本原因のクエリ非効率は解決しない × 代替案(オンデマンド維持+最適化)との比較なし Good — 実測ベースで損益分岐点を再計算 実測ピーク240スロット + マージン → 300スロット 修正⑤: $1,700×3 = $5,100/月が正しい必要額 損益分岐点(正): $5,100÷$5 = 1,020TB/月 修正①②: Bad案の340TBより遥かに遠い基準値 現状182TB/月・成長率+12%/月 到達時期 ≒ 約15.2ヶ月後 修正③: 複利成長式 n=ln(1020/182)/ln(1.12) レガシー15モデル最適化 → 147TB/月 修正④: パーティションフィルタ+列選択で40TB→5TB 月額$910→$735、到達時期は約17.1ヶ月後に延伸 修正⑥⑦: SLA違反リスク回避+代替案比較を実施 現状維持+最適化が最安、flat-rateは時期尚早と判定 ✓ 損益分岐点1,020TBまで現状の5.6倍の余裕 ✓ 過剰投資($5,100/月)とSLA違反の両方を回避 ✓ 将来のflat-rate移行時の必要スロット数も圧縮 ✓ 直接削減額$175/月 + リスク回避効果が本質的価値 修正

模範解答

修正⑤⑥: 実測スロット使用量に基づく必要スロット数の再試算

項目値
nightly dbtバッチ ピーク同時消費スロット数(95パーセンタイル実測)240スロット
安全マージン(バースト・将来モデル追加分)+25%
必要スロット数(100単位に切り上げ)300スロット
Bad案が想定していたスロット数100スロット
不足分200スロット
300スロットのflat-rate月額$5,100/月(158.7万円/月)
100スロットでは実測ピーク(240スロット)にすら届かず、nightly dbtバッチの実行中に恒常的なスロット待ち(キューイング)が発生する。45モデルの依存関係次第では、遅延の累積が3:30終了のSLAを超過するリスクが高い。

修正①②③: 損益分岐点の再計算と到達時期の試算

案flat-rate月額損益分岐スキャン量(TB/月)現状182TB/月との差
Bad案(想定100スロット)$1,700340TB158TB分の余裕
Good案(実測ベース300スロット)$5,1001,020TB838TB分の余裕
到達時期 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ヶ月後
実測に基づいて正しくスロット数を見積もると、損益分岐点は当初の340TB/月ではなく1,020TB/月まで跳ね上がる。現状182TB/月・成長率+12%/月では到達まで約1年3ヶ月あり、「今すぐ切り替えるべき」という結論は数字上まったく成立しない。

修正④: クエリ最適化によるスキャン量削減試算と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ヶ月(地味)
直接効果だけ見るとペイバック11.4ヶ月と地味だが、本当の価値は「Bad案のまま100スロットでflat-rateへ突入し、バッチSLA違反を起こしてから300スロット=$5,100/月へ緊急増強する」という最悪シナリオを未然に防いだ点にある。

現状維持・Bad案・Good案の比較

案月額根拠判定
現状維持(オンデマンド、最適化なし)$910182TB×$5現時点では最安
Bad案(flat-rate 100スロット、即時切替)$1,700 + SLA違反リスク実測の裏付けなし値上げ+運用リスクの二重苦
実測ベースflat-rate(300スロット、即時切替)$5,100実測240スロット+マージン過剰投資(損益分岐点に遠い)
Good案(クエリ最適化+オンデマンド継続)$735147TB×$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への切替は、実測スロット使用量とスキャン量の成長
トレンドを継続的にモニタリングし、必要性が定量的に裏付け
られた時点で再検討します。

ポイント解説

1flat-rateへの切替判断は「不安」ではなく損益分岐点(flat-rate月額÷オンデマンド単価)で行う — 定額プランは「使い放題で安心」という心理的メリットが先行しがちだが、実際にコストメリットが出るスキャン量の閾値を計算しない限り、値上げになるケースの方が多い。
2flat-rateの必要スロット数は「なんとなくの数字」ではなく実測ピーク消費量から逆算する — INFORMATION_SCHEMA.JOBS_BY_PROJECTのようなメタデータテーブルで実際のスロット消費を測定せずに容量を決めると、コスト超過とキャパシティ不足(SLA違反)の両方のリスクを抱える。
3コスト構造を変える前に、まずスキャン量そのものを削減できないか検討する — SELECT *・パーティションフィルタ欠如は典型的な「無駄なスキャン」の温床であり、課金方式を変えるより先に潰すべき根本原因であることが多い。
4成長トレンドを踏まえた将来予測(到達時期の試算)を必ず入れる — 「今は安い」だけでなく「いつ逆転するか」を複利成長の式で試算することで、"今すぐ切り替えるべきか、様子を見るべきか"を定量的に判断できる。
5最適化施策のROIは直接効果だけで測ると過小評価しがちで、避けられたリスク(過剰投資・SLA違反)も含めて評価する — 今回の11.4ヶ月というペイバックは地味に見えるが、Bad案をそのまま実行していた場合の月額$5,100(現状比+461%)という過剰投資を防いだ効果は、直接の削減額をはるかに上回る。

実務への応用

MOpsチームのようにdbtバッチとBIダッシュボードの両方でBigQueryを使うチームでは、「クエリ数・データ量が増えてきたので定額プランへ」という発想に流れやすい。しかし実務では、コスト増加の内訳(バッチの非効率クエリなのか、BIの高頻度アクセスなのか)を分解し、根本原因に手を打ってから課金方式の見直しを検討する順序が重要になる。INFORMATION_SCHEMAベースでスロット使用量・スキャン量を継続的にモニタリングする仕組みをdbtパイプラインやDataDogダッシュボードに組み込んでおけば、「切り替えるべきタイミング」を勘ではなく数字で判断できるようになる。

証券会社経験との接続: 固定金利と変動金利のどちらを選ぶかという判断も、将来の金利見通しと元本規模から損益分岐点を計算して決めるのが基本であり、「金利上昇が不安だから固定にする」という心理だけの判断はしない。BigQueryの課金方式選択も全く同じ構造で、「不安」ではなく「実測データに基づく損益分岐点」で意思決定するという型がそのまま活きる。

今日のまとめ

BigQueryの課金方式選択は「コストが青天井で不安」という心理ではなく、実測スロット消費量から逆算した正しい必要スロット数と、それに基づく損益分岐スキャン量・到達時期の試算で判断する。今回のケースでは、当てずっぽうの100スロット想定(損益分岐点340TB/月)に対し、実測ベースの正しい必要スロット数は300スロット(損益分岐点1,020TB/月)であり、現状182TB/月・成長率+12%/月でも到達まで約15ヶ月の余裕がある。コスト構造を変える前に、まずSELECT *・パーティションフィルタ欠如という根本原因を潰すことが、直接的な削減効果以上に「過剰投資とSLA違反という二重のリスク」を回避する最大の価値になる。

次のステップ

  • 発展問題: クエリ最適化実施から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 / 損益分岐点分析

自己評価(あとで記入)