クエリのドライランの実行

CLI でクエリを実行するとき、--dry_run フラグを使用してクエリにより読み取られるバイト数を見積もることができます。API やクライアント ライブラリを使用してクエリジョブを送信するときに dryRun パラメータを使用することもできます。

ドライランによって返された見積もりを料金計算ツールで使用すると、クエリの費用を計算できます。ドライランの実行には料金はかかりません。

必要な権限

クエリジョブを実行するには、少なくとも bigquery.jobs.create 権限が付与されている必要があります。クエリジョブを正常に完了させるには、クエリで参照するテーブルまたはビューが含まれるデータセットに対するアクセス権も付与されている必要があります。データセットに対するアクセス制御については、データセットへのアクセスの制御をご覧ください。

bigquery.jobs.create 権限は、事前定義された以下の Cloud IAM の役割に含まれています。

  • bigquery.user
  • bigquery.jobUser
  • bigquery.admin

また、bigquery.datasets.create 権限を持つユーザーがデータセットを作成すると、そのデータセットに対する bigquery.dataOwner アクセス権がユーザーに付与されます。bigquery.dataOwner アクセス権により、データセット内のテーブルとビューに対するクエリが許可されます。

BigQuery での Cloud IAM の役割については、事前定義された役割と権限をご覧ください。

ドライランの実行

クエリジョブのドライランを実行するには、次のようにします。

  • CLI の場合は query コマンドで --dry_run フラグを指定
  • API またはクライアント ライブラリを使用するときはジョブ構成で dryRun パラメータを指定

ドライランの実行

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

Console

現時点では、Cloud 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 のリファレンス ドキュメントをご覧ください。

import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/bigquery"
)

// queryDryRun demonstrates issuing a dry run query to validate query structure and
// provide an estimate of the bytes scanned.
func queryDryRun(w io.Writer, projectID string) error {
	// projectID := "my-project-id"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}

	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.Fprintf(w, "This query will process %d bytes\n", status.Statistics.TotalBytesProcessed)
	return nil
}

Python

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

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

from google.cloud import bigquery

# TODO(developer): Construct a BigQuery client object.
# client = bigquery.Client()

job_config = bigquery.QueryJobConfig(dry_run=True, use_query_cache=False)

# Start the query, passing in the extra configuration.
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"
    ),
    job_config=job_config,
)  # Make an API request.

# A dry run query completes immediately.
print("This query will process {} bytes.".format(query_job.total_bytes_processed))