DEV Community

Atsumi
Atsumi

Posted on

BigQueryベストプラクティス (コスト管理)

公式ドキュメントに記載のある「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.

ダッシュボードでコストを管理する

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)