BigQuery 最佳做法:控管費用

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

建議不要使用 SELECT *

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

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

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

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

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

如果您確實需要查詢資料表中的每個資料欄,但範圍限定在資料子集,請考慮:

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

使用預覽選項以取樣資料

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

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

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

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

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

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

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

  • 在 Cloud Console 或傳統網頁版 UI 中查看查詢驗證工具
  • 使用 Google Cloud Platform Pricing Calculator
  • 使用以下方式執行模擬測試:
    • CLI 中的 --dry_run 旗標
    • 使用 API 提交查詢工作時的 dryRun 參數

使用查詢驗證工具

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

查詢驗證工具

執行模擬測試

如要執行模擬測試:

主控台

目前無法使用 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 執行模擬測試,請在工作設定中將 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

如要使用 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))

使用 Pricing Calculator

如要在 Google Cloud 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」(計費位元組上限) 欄位中輸入整數。目前 Cloud Console 不支援「Maximum Bytes Billed」(計費位元組上限) 選項。計費位元組上限
  • 在 CLI 中,使用 bq query 指令並加上 --maximum_bytes_billed 旗標。

    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 Data Studio 等工具中以視覺化方式呈現。如需有關建立計費資訊主頁的教學課程,請參閱使用 BigQuery 與 Google Data Studio 視覺化 GCP 計費一文。

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

按日期分區資料

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

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

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

分階段具體化查詢結果

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

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

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

考慮大型結果集的費用

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

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

詳情請參閱儲存空間價格

謹慎使用串流插入功能

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

將資料載入 BigQuery 不用額外費用,但如果要將資料串流到 BigQuery 就需要付費。除非必須立即使用您的資料,否則請載入資料,而不要串流資料。