使用 BigQuery 進階執行階段
BigQuery 進階執行階段是一組效能強化功能,可自動加速分析工作負載,使用者不必採取任何動作或變更程式碼。本文將說明這些效能提升功能,包括強化向量化和簡短查詢最佳化。
角色和權限
如要取得指定設定所需的權限,請要求管理員在專案或機構中授予您「BigQuery 管理員 」(roles/bigquery.admin) IAM 角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
強化向量化
向量化執行作業是一種查詢處理模型,可處理與 CPU 快取大小一致的資料區塊,並使用單指令多資料 (SIMD) 指令。強化向量化功能可將 BigQuery 中的向量化查詢執行作業,擴展至查詢處理的下列層面:
- 透過運用 Capacitor 儲存格式中的專用資料編碼,即可對編碼資料執行篩選器評估作業。
- 專用編碼會透過查詢計畫傳播,因此系統可以在資料編碼時處理更多資料。
- BigQuery 實作運算式摺疊功能來評估決定性函式和常數運算式,可將複雜述詞簡化為常數值。
短查詢最佳化
BigQuery 通常會在分散式環境中執行查詢,並使用隨機中間層。短查詢最佳化 動態識別可做為單一階段執行的查詢,減少延遲時間和運算單元用量。如果查詢是在單一階段執行,就能更有效地使用專用編碼。搭配選用工作建立模式使用時,這些最佳化措施最有效,可盡量減少工作啟動、維護和結果擷取延遲。
短查詢最佳化功能的適用資格不固定,會受到下列因素影響:
- 預測的資料掃描大小。
- 所需資料移動量。
- 查詢篩選器的選擇性。
- 儲存空間中資料的類型和實體配置。
- 整體查詢結構。
- 過去查詢執行的歷史統計資料。
啟用進階執行階段
2025 年 9 月 15 日至 2026 年初,BigQuery 將開始使用進階執行階段,做為所有專案的預設執行階段。如要在現有專案或機構中啟用進階執行階段,請使用 ALTER PROJECT 或 ALTER ORGANIZATION 陳述式變更預設設定。在陳述式中,將 query_runtime 引數設為 'advanced'。例如:
ALTER PROJECTPROJECT_NAMESET OPTIONS ( `region-LOCATION.query_runtime` = 'advanced' );
更改下列內容:
PROJECT_NAME:專案名稱LOCATION:工作應嘗試使用進階執行階段的位置
變更可能需要幾分鐘才會生效。
啟用進階執行階段後,專案或機構中的符合資格查詢都會使用進階執行階段,無論查詢工作是由哪位使用者建立都一樣。
預估進階執行階段的影響
如要估算進階執行階段的影響,可以使用下列 SQL 查詢,找出預估執行時間改善幅度最大的專案查詢:
WITH
jobs AS (
SELECT
*,
query_info.query_hashes.normalized_literals AS query_hash,
TIMESTAMP_DIFF(end_time, start_time, MILLISECOND) AS elapsed_ms,
EXISTS(
SELECT 1
FROM UNNEST(JSON_QUERY_ARRAY(query_info.optimization_details.optimizations)) AS o
WHERE JSON_VALUE(o, '$.enhanced_vectorization') = 'applied'
) AS has_advanced_runtime
FROM region-LOCATION.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE EXTRACT(DATE FROM creation_time) > DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY)
),
most_recent_jobs_without_advanced_runtime AS (
SELECT *
FROM jobs
WHERE NOT has_advanced_runtime
QUALIFY ROW_NUMBER() OVER (PARTITION BY query_hash ORDER BY end_time DESC) = 1
)
SELECT
job.job_id,
100 * SAFE_DIVIDE(
original_job.elapsed_ms - job.elapsed_ms,
original_job.elapsed_ms) AS percent_execution_time_saved,
job.elapsed_ms AS new_elapsed_ms,
original_job.elapsed_ms AS original_elapsed_ms,
FROM jobs AS job
INNER JOIN most_recent_jobs_without_advanced_runtime AS original_job
USING (query_hash)
WHERE
job.has_advanced_runtime
AND original_job.end_time < job.start_time
ORDER BY percent_execution_time_saved DESC
LIMIT 10;
更改下列內容:
LOCATION:應評估工作成效的地點
如果已啟用並套用進階執行階段,這項查詢的結果可能類似於下列內容:
/*--------------+----------------------------+----------------+---------------------*
| job_id | percent_elapsed_time_saved | new_elapsed_ms | original_elapsed_ms |
+--------------+----------------------------+----------------+---------------------+
| sample_job1 | 45.38834951456311 | 225 | 412 |
| sample_job2 | 45.19480519480519 | 211 | 385 |
| sample_job3 | 33.246753246753244 | 257 | 385 |
| sample_job4 | 29.28802588996764 | 1311 | 1854 |
| sample_job5 | 28.18181818181818 | 1027 | 1430 |
| sample_job6 | 25.804195804195807 | 1061 | 1430 |
| sample_job7 | 25.734265734265733 | 1062 | 1430 |
| sample_job8 | 25.454545454545453 | 1066 | 1430 |
| sample_job9 | 25.384615384615383 | 1067 | 1430 |
| sample_job10 | 25.034965034965033 | 1072 | 1430 |
*--------------+----------------------------+----------------+---------------------*/
這項查詢的結果僅為進階執行階段影響的預估值。 影響查詢效能的因素有很多,包括但不限於可用時段、資料隨時間的變化、檢視區塊或 UDF 定義,以及查詢參數值的差異。
如果這項查詢的結果為空白,表示沒有任何工作使用進階執行階段,或是所有工作都在 30 天前完成最佳化。
這項查詢可套用至其他查詢效能指標,例如 total_slot_ms 和 total_bytes_billed。詳情請參閱 INFORMATION_SCHEMA.JOBS_BY_PROJECT 的結構定義。