BigQuery 最佳做法:控管費用

這個頁面說明在 BigQuery 中控管費用的最佳做法。

避免使用 SELECT *

最佳做法:僅查詢所需資料欄。

使用 SELECT * 來查詢資料所需要的費用是最高的。當您使用 SELECT * 時,BigQuery 會完整掃描資料表中的每個資料欄。

如果您要進行資料實驗或是探索資料,請使用其中一個資料預覽選項,而非 SELECT *

LIMIT 子句套用至 SELECT * 查詢不會影響讀取的資料量。系統不僅會收取您讀取整個資料表中所有位元組的費用,也會收取超過免費版配額的查詢數費用。

相反地,只要查詢需要的資料欄即可。例如,使用 SELECT * EXCEPT 將一或多個資料欄排除在結果之外。

如果您需要查詢資料表中的每個資料欄,但僅要查詢資料子集,請考慮:

  • 在目的地資料表中將結果具體化並改為查詢該資料表
  • 依照日期將表格分區,並查詢相關分區,例如:WHERE _PARTITIONDATE="2017-01-01" 僅掃描 2017 年 1 月 1 日的分區

使用預覽選項的範例資料

最佳做法:如果您只是想大致查看或預覽資料表中的資料,請勿使用查詢功能。

如果您只是想大致查看一下您的資料 (或是做測試),可以使用資料表預覽選項來免費查看資料,而不會影響到配額。

BigQuery 支援下列資料預覽選項:

  • 在 GCP 主控台或傳統網頁版 UI 中,在「Table Details」(資料表詳細資料) 頁面上,按一下 [Preview] (預覽) 分頁標籤以取樣資料。
  • 在 CLI 中,使用 bq head 指令並指定要預覽的資料列數。
  • 在 API 中,使用 tabledata.list 從一組指定的資料列擷取資料表資料。

執行查詢之前預估查詢的價格

最佳做法:在執行查詢之前,請先檢查並估算需要支付多少費用。

查詢作業是根據系統所讀取的資料量 (以位元組數為單位) 計費。如要在執行查詢之前估算費用,請使用:

使用查詢驗證工具

在 GCP 主控台或傳統網頁版 UI 中輸入查詢時,查詢驗證工具會驗證查詢語法,並估算讀取的位元組數。您可以在 Pricing Calculator 中使用這項估算值來計算查詢費用。

查詢驗證工具

執行模擬測試

指令列

在 CLI 中執行查詢時,您可以使用 --dry_run 標記來估算讀取的位元組數。您可以在 Pricing Calculator 中使用這項估算值來計算查詢費用。

例如,以下查詢會產生下列回應:

    bq --location=[LOCATION] query --use_legacy_sql=false --dry_run 'SELECT COUNTRY, AIRPORT, IATA FROM `[PROJECT].[DATASET].airports` LIMIT 1000'
    Query successfully validated. Assuming the tables are not modified, running this query will process 10918 bytes of data.

如要使用 API 執行模擬測試,請提交 jobs.configuration.dryRun 設定為 true 的查詢工作。

API

如要使用 API 執行模擬測試,請提交 jobs.configuration.dryRun 設定為 true 的查詢工作。

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

在試行此示例之前,請至 BigQuery 快速入門導覽課程:使用用戶端程式庫,按照 Python 設定說明進行操作。詳情請參閱 BigQuery Python API 參考說明文件

如要使用 Python 用戶端程式庫執行模擬測試,請將 QueryJobConfig.dry_run 屬性設為 True。 如果您提供了模擬測試的查詢設定,則 Client.query() 一律會傳回已完成的 QueryJob
# 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))

使用 Pricing Calculator

如要在 Google Cloud Platform Pricing Calculator 中估算查詢費用,請以 MB、GB、TB 或 PB 為單位輸入查詢處理的位元組數。如果您的查詢處理小於 1 TB 的資料量,則估算值為 $0 美元,因為 BigQuery 每個月會隨需免費提供 1 TB 的查詢處理。

Pricing Calculator

透過限制計費的位元組數來限制查詢費用

最佳做法:使用計費位元組上限設定來限制查詢費用。

您可以使用計費位元組上限設定,限制針對查詢計費的位元組數。當您設定計費位元組上限時,如果查詢將會讀取超出限制的位元組,查詢就會失敗,而不會產生費用。

如果查詢因計費位元組上限設定而失敗,會傳回以下這樣的錯誤:

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

設定資料量計費上限:

  • 在傳統 BigQuery 網頁版 UI 中,在查詢選項的「Maximum Bytes Billed」(計費位元組上限) 欄位中輸入整數。目前 GCP 主控台不支援「Maximum Bytes Billed」(計費位元組上限) 選項。 計費位元組上限
  • 在 CLI 中,使用 bq query 指令並搭配使用 --maximum_bytes_billed 標記。

    bq --location=US query --maximum_bytes_billed=1000000 --use_legacy_sql=false "SELECT word FROM `bigquery-public-data.samples.shakespeare`"
    
  • 在 API 中,設定工作設定中的 maximumBytesBilled 屬性。

LIMIT 子句不會對費用造成影響

最佳做法:不要使用 LIMIT 子句做為費用控管的方法。

LIMIT 子句套用至查詢不會影響讀取的資料量,只會限制結果集輸出。系統會收取您如查詢所指示,在完整資料表中讀取所有位元組的費用。

不管是否有 LIMIT 子句,都會收取超過免費版配額的查詢讀取資料量費用。

使用資訊主頁查看費用並查詢您的稽核記錄

最佳做法:請建立資訊主頁來查看您的計費資料,使您能夠對 BigQuery 用量進行調整。另外也請考慮將稽核記錄串流至 BigQuery,使您能夠分析用量模式。

您可將計費資料匯出至 BigQuery 並在 Google Data Studio 等工具中以視覺化方式呈現。如需有關建立計費資訊主頁的教學課程,請參閱使用 BigQuery 與 Google Data Studio 視覺化 GCP 計費一文。

您也可將稽核記錄串流至 BigQuery,並分析例如使用者查詢費用等用量模式的記錄。

按日期分區資料

最佳做法:按日期分區資料表。

如有可能,請按日期分區 BigQuery 資料表。分區資料表可讓您查詢資料的相關子集,進而改善效能並降低費用。

例如,查詢分區資料表時,請使用 _PARTITIONTIME 虛擬資料欄來篩選日期或某一日期範圍。查詢只會處理該日期或日期範圍指定的分區中的資料。

分階段具體化查詢結果

最佳做法:如有可能,請分階段具體化查詢結果。

如果您要建立大型、多階段的查詢,每次執行查詢時,BigQuery 都會讀取查詢要求的所有資料。系統會收取您每次執行查詢時讀取所有資料的費用。

因此,請改為分階段查詢,每個階段都會將查詢結果寫入目的地資料表來具體化查詢結果。 查詢較小的目的地資料表會減少讀取的資料量並降低費用。儲存具體化結果的費用比處理大量資料的費用低很多。

考慮大型結果集的費用

最佳做法:如果您將大型查詢結果寫入目的地資料表,請使用預設資料表到期時間,等到您不再需要這些資料時,系統便會依照設定的時間來刪除資料。

在 BigQuery 儲存空間中保留大型結果集會產生費用。如果您不需要結果的擁有存取權,請使用預設資料表到期時間為您自動刪除資料。

詳情請參閱儲存空間價格

謹慎使用串流插入功能

最佳做法:只有在必須立即使用您的資料時,才使用串流插入功能。

將資料載入到 BigQuery 無需費用。 但是,將資料串流到 BigQuery 需要收費。除非必須立即使用您的資料,否則請載入資料,而不要串流資料。

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁