公式ドキュメントに記載のある「BigQuery best practices」をまとめてみるシリーズ。
今回はコスト管理のプラクティスをまとめます。
イタリック体はドキュメントに記載のない追加コメント
TL;DR
-
SELECT *
ではなく、必要なカラムのみを指定することで、読み込むデータ量を減らす - データを試しに見たいだけならpreviewr利用する。
- クエリ実行前にコストを確認する
- LIMIT句ではコストを絞ることができない。
- 請求データを可視化しコストを管理する
- パーティショ分割テーブルを利用する
- 複数のステージがあるクエリ(SELECTした結果を別のクエリで参照するなど)は中間結果を保存する
- サイズの大きなテーブルを作る時は、有効期限を設定する。
- ストリーミングインサートはすぐに利用したいデータにのみ利用する。
ベストプラクティス
Query only the columns that you need.
SELECT *
ではなく、必要なカラムのみを指定することで、読み込むデータ量を減らす
- 全カラムに対してフルスキャンが行われる
- データを実験的に眺めたいだけならpreviewや
bq head
を利用しよう -
LIMIT
では読み込むデータ量を減らすことはできない。LIMIT
なくてもLIMIT 1
でも全く同じデータ量が処理される。INFORMATION_SCHEMA.JOBS_BY_XXX.total_bytes_processed
で確認可能。 -
SELECT * EXCEPT(...)
は有効なので、一部のカラムのみ除外したい場合は利用しよう - 行を絞って全カラムを読み込みたい時は、そのサブセットのみを持った新しいテーブルを作るか、パーティション分割テーブルを利用しよう
Don't run queries to explore or preview table data.
データを試しにみるのならpreviewr利用する。
(既出のため割愛)
Before running queries, preview them to estimate costs.
クエリ実行前にコストを確認する
- BigQueryコンソールは、処理予定のデータ量をクエリ実行前に表示してくれる
- CLIなら
bq query --dry_run
で取得可能 - データ量からコストを計算するには、Pricing Calculatorが利用可能
Use the maximum bytes billed setting to limit query costs.
Maximum bytes billed
を指定することで高額なクエリ実行を抑制する
-
Maximum bytes billed
を設定すれば、それ以上のデータ量を処理するクエリは実行できなくなるので、意図せぬ事故を防ぐことができる。
Do not use a LIMIT clause as a method of cost control.
LIMIT句ではコストを絞ることができない。
(既出のため割愛)
Create a dashboard to view your billing data so you can make adjustments to your BigQuery usage. Also consider streaming your audit logs to BigQuery so you can analyze usage patterns.
ダッシュボードでコストを管理する
- 請求データをエクスポートして、BigQueryにロードすることでコストダッシュボードを作ることができる
- データ量の監視であれば、
INFORMATION_SCHEMA.JOBS_BY_XXX.total_bytes_processed
を事前準備なしで使える。
Partition your tables by date
パーティショ分割テーブルを利用する
(既出のため割愛)
If possible, materialize your query results in stages
複数のステージがあるクエリ(SELECTした結果を別のクエリで参照するなど)は中間結果を中間テーブルに保存する
- 複数のステージがあるクエリ(SELECTした結果を別のクエリで参照するなど)の場合、毎回全クエリが実行される。
- 効率化するには、中間結果テーブルを作る
If you are writing large query results to a destination table, use the default table expiration time to remove the data when it's no longer needed.
サイズの大きなテーブルを作る時は、有効期限を設定する。
- クエリだけでなくストレージにもコストが発生するので、一時的にしか利用しない大きなテーブルには有効期限を設定する。
Use streaming inserts only if your data must be immediately available
ストリーミングインサートはすぐに利用したいデータにのみ利用する。
- LOAD jobによるデータロードは無料で実行可能だが、ストリーミングインサートには費用が発生する。
Top comments (0)