BigQuery の料金体系(概観)
BigQuery のコストは オンデマンドクエリ課金・フラットレートスロット・ストレージ階層 の 3 要素で決まります。各要素の課金仕組みと、実務で把握しておくべきポイントをまず整理しましょう。
オンデマンドクエリ課金
オンデマンドでは、クエリが走査した バイト数(スキャン量) に対して従量課金されます。単価は Google Cloud の公式料金ページに掲載されています(2024 年 12 月時点の最新情報)。スキャン量を最小化すれば、単価が下がっても総コストは抑えられるため、クエリ設計段階から走査バイトを意識することが重要です。
- 公式料金表:https://cloud.google.com/bigquery/pricing
- 単位は 1 TB あたりのスキャンバイトに対して課金(例:$5/TB)
フラットレートスロットと Flex スロット
フラットレートは月額固定費で一定数の スロット(CPU 相当の処理能力)を予約します。2024 年以降、Google は「Flex スロット」というオンデマンド的に追加できるスロットも提供しており、ベース予約スロット + 必要時に Flex で伸張というハイブリッド運用が可能です。
- フラットレートの特徴:利用率が高いほど固定費化でき、予測しやすいコスト構造になる
- Flex スロットの概要:予約スロットに足りない分だけオンデマンドで追加課金される柔軟な単位(1 スロット=1 秒あたり 60 CPU‑core)
※2026 年版の料金は公式には未発表です。将来予測として記載する場合は、必ず「現行(2024 年時点)の情報をもとにした推測」と明示してください。
ストレージ階層と単価
BigQuery のストレージは 標準ストレージ、Long‑Term Storage (Coldline)、Archive の 3 階層があり、データのアクセス頻度や保存期間で単価が変わります。公式料金表に各階層の GB あたり月額費用が掲載されているので、ライフサイクルポリシーと合わせて最適な階層を選択します。
- 標準ストレージ:頻繁にアクセスするデータ向け(例:$0.02/GB/月)
- Long‑Term Storage:30 日以上更新がないテーブルに自動適用可能(約 1/3 のコスト)
- Archive:アクセスが極めて稀なバックアップ用途(約 1/10 のコスト)
要点:オンデマンドはスキャンバイト、フラットレートは予約スロット数、ストレージは保存階層で課金される。各要素を可視化し、実務に合わせて組み合わせることがコスト削減の第一歩です。
クエリコスト削減テクニック
クエリ単体の費用は「走査バイト」と「計算リソース」に依存します。ここでは、初心者でもすぐに実装できる具体的な手法を紹介します。
パーティショニングとクラスタリング
パーティションテーブルは日付や整数でデータを分割し、対象期間だけを走査できます。また、クラスタリング を併用すると同一パーティション内でもソート順に近い行がまとめられ、スキャンバイトがさらに削減されます。
|
1 2 3 4 |
CREATE TABLE project.dataset.events PARTITION BY DATE(event_date) CLUSTER BY user_id; |
- パーティションは「日付」「整数範囲」などで設定可能
- クラスタリングは頻繁にフィルタ条件になるカラムを対象にするのがベスト
プレビュー・サブクエリ活用
プレビューモード(bq query --dry_run)では実際にデータを読み込まずに 予測スキャンバイト を取得できます。開発段階でフルスキャンを防ぎ、必要最小限のデータだけを次工程へ渡す設計が可能です。また、WITH 句で前処理結果を一時テーブル化するサブクエリは、同じロジックを複数回実行しないようにします。
|
1 2 3 4 |
-- Dry run example bq query --dry_run --use_legacy_sql=false \ 'SELECT COUNT(*) FROM `project.dataset.large_table` WHERE event_date = "2024-01-01"'; |
必要な列だけ取得とデータ型最適化
SELECT * は全カラムを走査するためコストが増大します。使用する列のみを明示的に指定し、さらに 適切なデータ型(例:日付は DATE、整数は INT64)で保存すれば、ストレージとクエリの両方で節約できます。
- 文字列 → 必要なら
STRINGのまま、数値はNUMERICやINT64に変換 - 大規模テーブルでは列ごとのサイズを把握し、肥大化しているカラムは正規化や圧縮形式(Parquet/Avro)に変更
UDF の使用上の注意
ユーザー定義関数(UDF)は便利ですが、JavaScript 実装の場合 CPU コストが高くなることがあります。頻繁に呼び出すロジックは標準 SQL に置き換えるか、マテリアライズドビューで事前計算した結果を再利用すると効果的です。
要点:パーティション・クラスタリングで走査対象を絞り、プレビューやサブクエリで無駄なスキャンを防止。列指定とデータ型最適化、UDF の過剰使用抑制が実務的なコスト削減策です。
スロット管理とハイブリッド運用
スロットはクエリ処理能力そのものです。過剰予約や不足による遅延を防ぐため、利用率データに基づいた調整が必要です。
利用率メトリクスの確認と予約数調整
Cloud Monitoring の bigquery_slot_utilization メトリクスでスロット使用率をリアルタイムに把握できます。70 % 以上が継続すれば予約スロットを増やし、固定費化を検討します。一方 30 % 未満 が続く場合は予約数を削減し、Flex スロットへ切り替えるとコスト効率が上がります。
|
1 2 3 4 5 |
Monitoring metric: bigquery_slot_utilization Thresholds: - > 0.70 → increase reservation – < 0.30 → decrease reservation / switch to Flex |
スロット共有プールの活用
組織全体で スロット共有プール を作成すると、プロジェクト間で未使用スロットが自動的に流動化します。これにより「予約したが使わない」スロットを減らし、総コストを最適化できます。プールの設定は Cloud Console の BigQuery → 予約 メニューから行います。
オンデマンド・フラットレートの組み合わせ例(ハイブリッドモデル)
ハイブリッド運用では、ベースラインの安定処理をフラットレートで確保し、ピーク時は Flex スロットまたはオンデマンドに切り替えます。実装手順は次の通りです。
- 平均月間スロット利用率 を測定(過去 30 日分)
- ベースライン予約:70 % 超過分だけフラットレートで確保
- 変動分 は Flex スロットかオンデマンドに委ねる
このパターンにより、固定費と従量課金のバランスが取れ、予算超過リスクを低減できます。
要点:スロット利用率を根拠に予約数を調整し、共有プールで無駄を排除。オンデマンドとフラットレートを組み合わせたハイブリッド運用が実務的な最適化手法です。
ストレージコスト最適化戦略
保存期間とアクセス頻度が課金に直結する BigQuery のストレージ。以下の自動化策で長期保存割引を最大限活かす方法を解説します。
ライフサイクル管理と自動階層移行
テーブル単位で ライフサイクルポリシー を設定すると、更新が一定期間無いデータを自動的に Long‑Term Storage(Coldline)や Archive に移行できます。Cloud Scheduler と Cloud Functions を組み合わせれば、30 日以上更新のないテーブルを検出し ALTER TABLE … SET OPTIONS (storage_type="COLDLINE") で階層変更が可能です。
|
1 2 3 4 5 6 7 8 9 |
-- Example: set table to Coldline after 60 days of inactivity EXECUTE IMMEDIATE ''' ALTER TABLE `project.dataset.table` SET OPTIONS ( expiration_timestamp = TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 180 DAY), storage_type = "COLDLINE" ) '''; |
テーブル期限設定とパーティション削除スケジュール
expiration_timestamp オプションでテーブルやパーティションごとに有効期限を設定できます。期限が来ると自動的に削除され、不要データの保管コストがゼロになります。
|
1 2 3 4 5 |
CREATE TABLE project.dataset.temp_table OPTIONS ( expiration_timestamp = TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 90 DAY) ); |
外部テーブルとフェデレーテッドクエリの活用
アクセス頻度が低い大容量 CSV/Parquet は 外部テーブル として Cloud Storage に置き、必要時にだけ読み込む形を取ります。これにより BigQuery の標準ストレージ料金は発生せず、クエリ実行時のみデータ転送コストがかかります。
|
1 2 3 4 5 6 |
CREATE EXTERNAL TABLE project.dataset.ext_events OPTIONS ( format = 'PARQUET', uris = ['gs://my-bucket/events/*.parquet'] ); |
要点:テーブルやパーティションに期限設定と自動階層移行ポリシーを組み込み、外部テーブルで低頻度データは Cloud Storage に委託することで、ストレージコストを大幅に削減できます。
継続的なコストモニタリングと最適化
コスト削減は一回限りの作業ではなく、継続的な可視化と改善サイクル が不可欠です。以下の手順でモニタリング基盤を構築します。
Cloud Monitoring とカスタムダッシュボード
bigquery_job_bytes_processed(処理バイト)や bigquery_slot_utilization(スロット利用率)といった指標をダッシュボードにまとめ、急激な増加をリアルタイムで検知できるようにします。アラート条件は「スキャンバイトが前日比 30 % 超」や「スロット利用率が 90 % 超過」など、運用上の閾値を設定しましょう。
Billing Export と予算アラート設定
BigQuery の課金情報は Billing Export 機能で別プロジェクトの BigQuery テーブルへ自動出力できます。このテーブルを元に月次レポートや部門別コスト分析を行い、予算超過時にはメール・Slack などに通知します。設定例は以下の通りです。
|
1 2 3 4 5 6 |
gcloud beta billing accounts export create \ --billing-account=012345-6789AB-CDEF01 \ --destination-project=my-billing-project \ --destination-dataset=billing_export \ --frequency=DAILY |
補助機能(マテリアライズドビュー、BI Engine 等)
- マテリアライズドビュー:集計結果を事前に保存し、再利用クエリのスキャンバイトをゼロに近づける。更新頻度は用途に合わせて設定可能。
- BI Engine:BigQuery のインメモリ分析エンジンで、ダッシュボード向けクエリの実行コストが事実上無料になる(キャッシュヒット時)。有効化はプロジェクト単位でオンにし、対象テーブルを
OPTIONS (materialized_view = true)に設定。 - Scheduled Query の結果キャッシュ:定期実行クエリの出力テーブルを再利用することで、毎回フルスキャンせずに済む。
要点:Cloud Monitoring と Billing Export でコストとリソース使用状況を可視化し、予算アラートで即時対応。マテリアライズドビューや BI Engine などの付加機能も併用して、継続的な最適化サイクルを構築します。
まとめ
- 料金体系はオンデマンドクエリ課金・フラットレートスロット・ストレージ階層 の三要素で構成。公式ドキュメントで最新単価を必ず確認すること。
- クエリ最適化 はパーティショニング/クラスタリング、プレビュー・サブクエリ、列指定とデータ型選定、UDF 使用の抑制が基本手法。
- スロット管理 では利用率メトリクスを根拠に予約数を調整し、共有プールやハイブリッド運用で固定費と従量課金のバランスを最適化。
- ストレージ削減 はテーブル・パーティションの期限設定、ライフサイクルポリシーによる自動階層移行、外部テーブル活用で実現できる。
- 継続的なモニタリング は Cloud Monitoring と Billing Export で可視化し、予算アラートと併せて即時対応。マテリアライズドビュー・BI Engine 等の補助機能を組み合わせれば、長期的にコスト削減が維持できる。
これらのステップを順次導入すれば、BigQuery の運用コストを実務レベルで確実に低減させることが可能です。公式情報は常に最新のものをご確認ください。