のクエリコストは 個人別の差が極端。「1 人が `SELECT *` を 1 回実行 → $50 飛ぶ」事故が頻発する場所。 の `INFORMATION_SCHEMA.JOBS_*` と の `ACCOUNT_USAGE.QUERY_HISTORY` を集計して 誰のクエリがいくらか を見える化します。
BigQuery: JOBS_BY_PROJECT
ユーザ別の月次コスト
SQL
-- 過去 30 日のユーザ別コストSELECT user_email, COUNT(*) AS query_count, SUM(total_bytes_billed) / POW(10, 12) AS tb_billed, SUM(total_bytes_billed) / POW(10, 12) * 5.0 AS cost_usd_estimate, -- $5/TB SUM(total_slot_ms) / 1000 / 60 AS slot_minutesFROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECTWHERE creation_time >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY) AND state = 'DONE' AND statement_type = 'SELECT'GROUP BY 1ORDER BY tb_billed DESCLIMIT 30;高コストクエリ TOP 10 を毎日 Slack 通知
前日の高コストクエリ
SQL
WITH top_queries AS ( SELECT user_email, job_id, LEFT(query, 200) AS query_preview, total_bytes_billed / POW(10, 9) AS gb_billed, creation_time FROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT WHERE DATE(creation_time) = DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY) AND total_bytes_billed > 100 * POW(10, 9) -- 100 GB 超)SELECT * FROM top_queriesORDER BY gb_billed DESCLIMIT 10;Snowflake: ACCOUNT_USAGE.QUERY_HISTORY
Snowflake の月次コスト by ロール
SQL
SELECT ROLE_NAME, USER_NAME, COUNT(*) AS query_count, SUM(EXECUTION_TIME) / 1000 / 60 AS execution_minutes, SUM(CREDITS_USED_CLOUD_SERVICES) AS creditsFROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORYWHERE START_TIME >= DATEADD(day, -30, CURRENT_DATE())GROUP BY 1, 2ORDER BY credits DESCLIMIT 30;ダッシュに載せる指標
- ユーザ別月次費用: 上位ヘビーユーザの実態
- チーム別 (QUERY_TAG / labels): チームの予算消化
- ジョブ種別: 対話的 vs バッチ vs
- 前日 TOP 10 高コストクエリ: Slack 通知
- フルテーブルスキャンクエリ: パーティション無視の事故
- slot 利用率: スロットを買い過ぎ / 不足
実装パターン: 自社 DWH に取り込み
保持期限を超えて残す
INFORMATION_SCHEMA.JOBS は 180 日 までしか遡れない。毎日の集計を別テーブルに保存し、何年も遡れる長期 audit テーブル にしておくのが本番運用の前提。詳細は データ民主化 EP.10。
次の話
EP.08 では、ここまでのコストを 個人別 / プロジェクト別 / チーム別 に配賦する設計を扱います。
この記事の感想を教えてください
あなたの 1 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。