BigQuery のおすすめの方法: 費用を抑える

このページでは、BigQuery で費用を抑えるためのおすすめの方法について説明します。

SELECT * を避ける

おすすめの方法: 必要な列のみを照会します。

SELECT * の使用は、データを照会するのに最も費用がかかる方法です。SELECT * を使用すると、BigQuery はテーブル内のすべての列をフルスキャンします。

データのテストや探索には、SELECT * ではなく、いずれかのデータ プレビュー オプションを使用してください。

LIMIT 句を SELECT * クエリに適用しても、読み取られるデータの量には影響しません。テーブル全体のすべてのバイトの読み取りに対して課金され、クエリは無料枠割り当てに対してカウントされます。

代わりに、必要な列のみを照会します。たとえば、SELECT * EXCEPT を使用して、結果から 1 つ以上の列を除外します。

テーブル内のすべての列を対象とするものの、データのサブセットに対してのみクエリを実行する必要がある場合は、以下のことを検討してください。

  • 代わりに、宛先テーブルで結果を実体化し、そのテーブルを照会する。
  • テーブルを日付別にパーティショニングし、関連するパーティションに対してクエリを実行する。たとえば、WHERE _PARTITIONDATE="2017-01-01" と指定すると、2017 年 1 月 1 日のパーティションのみがスキャンされます。

プレビュー オプションを使用してデータをサンプリングする

おすすめの方法: テーブルデータを探索またはプレビューするためにクエリを実行しないでください。

データを試したり調べたりする場合は、テーブル プレビュー オプションを使用すれば、割り当てに影響を与えることなく、無料でデータを表示できます。

BigQuery は、次のデータ プレビュー オプションをサポートしています。

  • GCP Console または従来のウェブ UI のテーブルの詳細ページで、[プレビュー] タブをクリックしてデータをサンプリングする。
  • CLI で bq head コマンドを使用して、プレビューする行数を指定する。
  • API で tabledata.list を使用して、指定した行のセットからテーブルデータを取得する。

クエリを実行する前に料金を見積もる

おすすめの方法: クエリを実行する前に、プレビューして費用を見積もります。

クエリは、読み込まれたバイト数に基づいて課金されます。クエリを実行する前に費用を見積もるには、以下を行います。

  • GCP Console または従来のウェブ UI でクエリ検証ツールを表示する
  • Google Cloud Platform 料金計算ツールを使用する
  • 以下を使用して、ドライランを実行する
    • CLI の --dry_run フラグ
    • dryRun パラメータ(API を使用してクエリジョブを送信する場合)

クエリ検証ツールの使用

GCP Console または従来のウェブ UI でクエリを入力すると、クエリ検証ツールがクエリ構文を検証し、読み取られるバイト数を見積もります。この見積もりを料金計算ツールで使用すると、クエリ費用を計算できます。

クエリ検証ツール

ドライランの実行

ドライランを実行するには:

Console

現時点では、GCP Console を使用してドライランを実行することはできません。

従来の UI

現時点では、ウェブ UI を使用してドライランを実行することはできません。

CLI

--dry_run フラグを使用してクエリを入力します。次に例を示します。

bq query \
--use_legacy_sql=false \
--dry_run \
'SELECT
   COUNTRY,
   AIRPORT,
   IATA
 FROM
   `project_id`.dataset.airports
 LIMIT
   1000'
 

このコマンドにより、次のレスポンスが生成されます。

Query successfully validated. Assuming the tables are not modified,
running this query will process 10918 bytes of data.

API

API を使用してドライランを実行するには、ジョブ構成で dryRuntrue に設定したクエリジョブを送信します。

Go

このサンプルを試す前に、BigQuery クイックスタート: クライアント ライブラリの使用にある Go 向けの手順に従って設定を行ってください。詳細については、BigQuery Go API のリファレンス ドキュメントをご覧ください。

// To run this sample, you will need to create (or reuse) a context and
// an instance of the bigquery client.  For example:
// import "cloud.google.com/go/bigquery"
// ctx := context.Background()
// client, err := bigquery.NewClient(ctx, "your-project-id")
q := client.Query(`
SELECT
	name,
	COUNT(*) as name_count
FROM ` + "`bigquery-public-data.usa_names.usa_1910_2013`" + `
WHERE state = 'WA'
GROUP BY name`)
q.DryRun = true
// Location must match that of the dataset(s) referenced in the query.
q.Location = "US"

job, err := q.Run(ctx)
if err != nil {
	return err
}
// Dry run is not asynchronous, so get the latest status and statistics.
status := job.LastStatus()
if err != nil {
	return err
}
fmt.Printf("This query will process %d bytes\n", status.Statistics.TotalBytesProcessed)

Python

Python クライアント ライブラリを使用してドライランを実行するには、QueryJobConfig.dry_run プロパティを True に設定します。 ドライランのクエリ構成が渡されると、Client.query() は常に完了した QueryJob を返します。

このサンプルを試す前に、BigQuery クイックスタート: クライアント ライブラリの使用にある Python の設定手順に従ってください。詳細については、BigQuery Python API のリファレンス ドキュメントをご覧ください。

# from google.cloud import bigquery
# client = bigquery.Client()

job_config = bigquery.QueryJobConfig()
job_config.dry_run = True
job_config.use_query_cache = False
query_job = client.query(
    (
        "SELECT name, COUNT(*) as name_count "
        "FROM `bigquery-public-data.usa_names.usa_1910_2013` "
        "WHERE state = 'WA' "
        "GROUP BY name"
    ),
    # Location must match that of the dataset(s) referenced in the query.
    location="US",
    job_config=job_config,
)  # API request

# A dry run query completes immediately.
assert query_job.state == "DONE"
assert query_job.dry_run

print("This query will process {} bytes.".format(query_job.total_bytes_processed))

料金計算ツールの使用

Google Cloud Platform 料金計算ツールでクエリ費用を見積もるには、クエリで処理されるバイト数を MB、GB、TB、または PB として入力します。クエリで 1 TB 未満が処理される場合は、BigQuery が 1 TB のオンデマンド クエリ処理を 1 か月間無料で提供するため、見積もりは $0 になります。

料金計算ツール

課金されるバイト数を制限してクエリ費用を抑える

おすすめの方法: 課金される最大バイト数の設定を使用して、クエリ費用を抑えます。

課金されるクエリのバイト数を制限するには、課金される最大バイト数の設定を使用します。課金される最大バイト数を設定した場合は、クエリが制限を超えたバイト数を読み取ると、課金されずにクエリが失敗します。

課金される最大バイト数を設定したことによってクエリが失敗した場合は、次のようなエラーが返されます。

Error: Query exceeded limit for bytes billed: 1000000. 10485760 or higher required.

課金される最大バイト数を設定するには:

  • 従来の BigQuery ウェブ UI では、クエリ オプションの [Maximum Bytes Billed] フィールドに整数を入力します。現在、GCP Console では [Maximum Bytes Billed] オプションをサポートしていません。 課金される最大バイト数
  • CLI では、--maximum_bytes_billed フラグを指定した bq query コマンドを使用します。

    bq query --maximum_bytes_billed=1000000 \
    --use_legacy_sql=false \
    'SELECT
       word
     FROM
       `bigquery-public-data`.samples.shakespeare'
    
  • API では、query ジョブ構成で maximumBytesBilled プロパティを設定します。

LIMIT は費用に影響しない

おすすめの方法: LIMIT 句をコスト管理の手法として使用しないでください。

LIMIT 句をクエリに適用しても、読み取られるデータの量は変わりません。結果セットの出力が制限されるだけです。クエリによって指定されたテーブル全体のすべてのバイトの読み取りに対して課金されます。

LIMIT 句の有無に関係なく、クエリによって読み取られるデータの量は、無料枠割り当ての対象としてカウントされます。

ダッシュボードを使用して費用を表示し、監査ログを照会する

おすすめの方法: BigQuery の使用量を調整できるように、課金データを表示するためのダッシュボードを作成します。また、使用パターンを分析できるように、BigQuery への監査ログのストリーミングも検討します。

BigQuery に課金データをエクスポートすると、Google データポータルなどのツールで可視化できます。課金ダッシュボードの作成方法のチュートリアルについては、BigQuery と Google データポータルを使用した GCP 課金の可視化をご覧ください。

また、監査ログを BigQuery にストリーミングして、ユーザー別のクエリ費用などの使用パターンに関するログを分析することもできます。

データを日付別にパーティション分割する

おすすめの方法: テーブルを日付別に分割します。

可能であれば、BigQuery テーブルを日付別に分割します。テーブルを分割することでデータの関連するサブセットを照会できるため、パフォーマンスが向上し費用が削減されます。

たとえば、パーティション分割テーブルを照会するときに、_PARTITIONTIME 擬似列を使用して日付または日付の範囲をフィルタ処理します。クエリは、日付または範囲で指定されたパーティション内のデータのみを処理します。

クエリ結果を段階的に実体化する

おすすめの方法: 可能であれば、クエリ結果を段階的に実体化します。

大容量のマルチステージ クエリを作成すると、それを実行するたびに、BigQuery がそのクエリに必要なすべてのデータを読み取ります。クエリが実行されるたびに読み取られるすべてのデータに対して課金されます。

代わりに、クエリを複数のステージに分割し、各ステージでクエリ結果を宛先テーブルに書き込むことにより実体化します。小容量の宛先テーブルを照会することにより、読み取られるデータの量が削減され、費用が削減されます。実体化された結果を保存する費用は、大量のデータを処理する費用よりはるかに少なくなります。

大容量の結果セットの費用を検討する

おすすめの方法: 大容量のクエリ結果を宛先テーブルに書き込む場合は、デフォルトのテーブル有効期限を適用して不要になったデータを削除します。

BigQuery ストレージで大容量の結果セットを維持するには費用がかかります。結果に永続的にアクセスする必要がなければ、デフォルトのテーブル有効期限を使用して自動的にデータを削除するようにします。

詳細については、ストレージの料金体系をご覧ください。

ストリーミング挿入は慎重に使用する

おすすめの方法: ストリーミング挿入は、データをすぐに公開する必要がある場合にのみ使用します。

BigQuery へのデータの読み込みは無料です。一方、BigQuery へのデータのストリーミングに対しては料金が発生します。データをすぐに利用可能にする必要がある場合を除き、データはストリーミングするのではなく、読み込んでください。

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。