G-gen の神谷です。本記事では Google Cloud (旧称 GCP) の BigQuery のコスト削減の方法をまとめます。
はじめに
コスト削減の手法
BigQuery は他クラウドのデータウェアハウスに比べてコストパフォーマンスの良いプロダクトと言えますが、使い方次第では高額になってしまいます。
複合的な要因が積み重なって料金が上がるため、銀の弾丸はありませんが、料金がかかる箇所を一つ一つ潰していくことで着実にトータルコストは抑えられます。本記事では、ここだけは押さえておきたいというポイントを解説します。
BigQuery の料金体系
プロジェクトごとに選択する利用プランによって課金体系が異なります。
- オンデマンド : デフォルト。処理されたデータ量に応じた課金。無料枠が存在する
- BigQuery Editions : 利用したコンピュートリソース量に応じた課金
プロジェクトのデフォルト設定はオンデマンドですが、無料枠を超える場合は BigQuery Editions を選択したほうが安価になる傾向があります。詳細は以下の記事を参照してください。
どこに料金がかかっているか調べる
調査ポイント
どこに料金がかかっているかに応じて、打ち手が異なります。 まずは、現状分析を行います。かかりがちなのは以下です。
- クエリ料金/コンピュート料金
- 必要がないのに「SELECT * (全カラムの選択)」を使っている
- BI ダッシュボードからビューを呼び出している
- パーティションやクラスタリングを適切に使っていない
- ストレージ料金
- バックアップ用のデータセットやテーブルが整理されず残っている
- パーティションやクラスタリングを適切に使っていない
- データ格納料金
- ストリーミングインサートを使っている
調査方法
調査方法としては以下です。特に Cloud Monitoring 指標は意外に忘れられがちです。有用な指標があるので、見るようにしたほうが良いでしょう。
- Cloud Monitoring 指標
- Google Cloud 料金コンソール
- INFORMATION SCHEMA
また Looker Studio から BigQuery を利用している場合、以下の記事も参照してください。
テクニック
SELECT * を使わず必要なカラムのみクエリする
- カラム数が多ければ多いほど、スキャン量が多くなり課金が大きくなる
- BigQuery は列指向データベースなので、選択する列を少なくすればするほどスキャン量が減る
パーティションやクラスタリングを使う
- ストレージ料金とクエリ料金の両方を削減できるため、効果的
- 初めて BigQuery を使うケースでは後回しにしがちなので、初めから設計と実装に組み込んでおいた方が良い
- 日次データであれば、ほとんどの場合日付パーティションを使った方が料金が安くなる
- カテゴリカルデータはクラスタリングがおすすめ
- BI のフィルタやディメンションで使われる項目にパーティションやクラスタを当てる
不要なバックアップテーブルを削除
- デフォルトで7日間のバックアップ (タイムトラベル) が自動で取得されるため、基本的にはそれを使う
- そうでなければ Cloud Storage に CSV としてエクスポートする自動化処理を実装する
ストリーミングインサートを使わない
- 旧来の書き込み方なので、非推奨
- バッチ読み込みか、BigQuery Storage Write API を使うようにする
BI ダッシュボードからビューを呼び出さない
- ビューはデータの実体を持たないのでクエリする度に元テーブルにスキャンがかかる
- 結合などは実体テーブル化しておきスキャン量を節約する
BigQuery BI Engine を利用
- BigQuery BI Engine (BigQuery のキャッシュ機能) との組み合わせによって、自社に最適なコストとパフォーマンスのトレードオフを決める
- Looker Studio, Looker, Tableau, Connected Sheets などで利用可能
BigQuery Editions を利用
- BigQuery Editions を導入すると Autoscaler の効果で料金が安価になる可能性がある
- ヒューマンエラーに備えあらかじめ料金のキャップ(上限)を設けておく (BigQuery Editions Autoscaler の Max 値)
- 1年/3年コミットメントを購入するとスロット単価が割引料金になる
シャーディングテーブルを使わない
- シャーディングテーブル (テーブル名に日付を持つテーブル) は現在非推奨
- なるべくパーティションテーブルを使うようにする
API 上限を設定する
オンデマンド課金がある一定以上にかからないように確実な上限設定をしたい場合は、以下の記事を参照してください。
公式のベストプラクティス
Google Cloud 公式で推奨されているコスト削減についても方法についても紹介します。
ダイレクトに課金を減らす方法に加えて、クエリパフォーマンスの最適化 (処理や実行時間、リソース消費量が減る) による間接的な費用削減方法についても説明されています。
- 大容量のクエリは小分けして中間テーブルに永続化する
- 課金される最大バイト数を設定して想定外に大きいクエリを仕組みによって回避する
- 正規化されているテーブルを非正規化する
- 具体的には、ネストデータ (STRUCT) や繰り返しデータ (ARRAY) を上手く使うことです。これまでの RDB の正規化のセオリーとは真逆を行くものです
- WHERE 句で BOOL、INT、FLOAT または DATE 列を使用する
- クラスタ列の型として STRING も利用可能ですが、前述の型に比べてパフォーマンスが下がる
- JOIN する前にデータを減らす
- 集計関数と GROUP BY は計算コストの高い処理なので、できるだけ早期にデータ量を減らしてから集計する
以下の公式リンクも参考にしてください。
- 参考 : BigQuery での費用の管理
- 参考 : クエリで処理されるデータ量を減らす
神谷 乗治 (記事一覧)
クラウドソリューション部
クラウドエンジニア。2017 年頃から Google Cloud を用いたデータ基盤構築や ML エンジニアリング、データ分析に従事。クラウドエース株式会社システム開発部マネージャーを経て現職。Google Cloud Partner Top Engineer 2023,2024、Google Cloud Champion Innovators(Database)、著書:「GCPの教科書III【Cloud AIプロダクト編】」