发布查询试运行

在 CLI 中运行查询时,您可以使用 --dry_run 标志来估算查询读取的字节数。在使用 API 或客户端库提交查询作业时,您还可以使用 dryRun 参数。

您可以使用试运行返回的估算值在价格计算器中计算查询费用。您不需要为执行试运行的操作支付费用。

所需权限

如需运行查询作业,您必须至少拥有 bigquery.jobs.create 权限。为成功完成查询作业,您还必须具有对包含查询引用的表或视图的数据集的访问权限。如需了解数据集访问权限控制,请参阅控制对数据集的访问权限

以下预定义的 Cloud IAM 角色可提供 bigquery.jobs.create 权限:

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

此外,如果用户具有 bigquery.datasets.create 权限,则当该用户创建数据集时,系统会为其授予该数据集的 bigquery.dataOwner 访问权限。借助 bigquery.dataOwner 访问权限,用户可以查询数据集内的表和视图。

如需详细了解 BigQuery 中的 Cloud IAM 角色,请参阅预定义的角色和权限

执行试运行

您可以使用以下方法对查询作业执行试运行:

  • CLI 中含 --dry_run 标志的 query 命令
  • 使用 API 或客户端库时在作业配置中设置 dryRun 参数

执行试运行

如需执行试运行,请执行以下操作:

控制台

目前,您无法使用 Cloud Console 执行试运行。

经典版界面

目前,您无法使用网页界面执行试运行。

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 执行试运行,请提交一项查询作业,并在作业配置中将 dryRun 设置为 true

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))