使用查詢佇列
BigQuery 會自動決定可同時執行的查詢數量,也就是動態並行。其他查詢會排入佇列,直到處理資源可供使用。本文說明如何控管最大並行目標,以及設定互動式和批次查詢的佇列逾時。
總覽
BigQuery 會根據可用的運算資源,動態決定可同時執行的查詢數量。系統會根據隨選專案或預留位置,計算可同時執行的查詢數量。其他查詢會排入佇列,直到有足夠容量可供執行為止。無論專案是隨選還是使用預訂,每個專案在每個區域的佇列長度上限為 1,000 個互動式查詢和 20,000 個批次查詢。以下範例顯示當計算出的查詢並行數為 202 時,隨選專案的行為:
對於預訂,您可以選擇設定並行目標上限,也就是預訂中可並行執行的查詢數量上限,確保每個查詢都能分配到最少數量的運算單元。您無法為隨選專案指定並行目標上限,系統一律會動態計算。
排隊行為
BigQuery 會強制執行公平排程,確保單一專案不會耗用保留項目中的所有運算單元。
系統會優先將並行比例最低的專案查詢從佇列中移除。執行期間,系統會先將運算單元平均分配給各專案,然後再分配給專案中的工作。
舉例來說,假設您有一個指派給兩個專案的預訂:A 和 B。BigQuery 會計算預留項目的並行數,結果為 5。專案 A 有四項查詢同時執行,專案 B 有一項查詢正在執行,其他查詢則在佇列中等待。即使專案 B 的查詢是在專案 A 的查詢之後提交,系統仍會先將專案 B 的查詢從佇列中移除。查詢開始執行後,會獲得共用預留位置的公平分配。
除了並行查詢總數外,BigQuery 還會動態決定每個隨選專案或預訂可執行的並行批次查詢數量上限。如果並行執行的批次查詢數量達到上限,系統會優先處理互動式查詢,即使這些查詢是稍後才提交也一樣。
刪除預留項目後,所有已排入佇列的查詢都會逾時。如果指派給預留項目的專案重新指派給其他預留項目,所有已排入佇列或正在執行的要求都會繼續在舊預留項目中執行,而所有新要求都會前往新預留項目。從保留項目移除指派給保留項目的專案後,執行中的查詢會繼續使用保留項目,而新的要求和佇列要求則會使用隨選模型執行。您可以視需要取消個別執行中或已加入佇列的查詢工作。
控制佇列逾時
如要控管互動式或批次查詢的佇列逾時,請使用 ALTER PROJECT SET OPTIONS
陳述式或 ALTER ORGANIZATION SET OPTIONS
陳述式,在專案或機構的預設設定中設定 default_interactive_query_queue_timeout_ms
或 default_batch_query_queue_timeout_ms
欄位。
如要查看專案中互動式或批次查詢的佇列逾時,請查詢 INFORMATION_SCHEMA.EFFECTIVE_PROJECT_OPTIONS
檢視區塊。
如要停用佇列功能,請將佇列逾時設為 -1。如果達到查詢並行上限,額外查詢會失敗並顯示 ADMISSION_DENIED
錯誤。
設定並行目標上限
建立預訂時,您可以手動設定並行目標上限。根據預設,並行目標上限為零,也就是說,BigQuery 會根據可用資源動態決定並行數量。否則,如果您設定非零目標,最大並行目標會指定預訂中並行執行的查詢數量上限,確保每個執行的查詢都有最低的可用時段容量。
即使提高並行上限目標,系統也不一定會同時執行更多查詢。實際的並行情況取決於可用的運算資源,您可以為預留項目新增更多運算單元,藉此增加並行情況。
必要的角色
如要取得設定新預留位置並行數所需的權限,請要求管理員在保有承諾的管理專案中,授予您 BigQuery 資源編輯者 (roles/bigquery.resourceEditor
) IAM 角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
這個預先定義的角色含有 bigquery.reservations.create
權限,必須具備該權限才能在新的預留項目中設定並行。
如要進一步瞭解 BigQuery 中的 IAM 角色,請參閱預先定義的角色與權限一文。
設定保留項目的目標並行層級上限
選取下列選項之一:
主控台
前往 Google Cloud 控制台的「BigQuery」頁面。
在導覽選單中,按一下「容量管理」。
按一下「建立預留項目」。
選取預訂設定。
如要展開「進階設定」部分,請按一下
展開箭頭。如要設定目標工作並行,請將「覆寫自動目標工作並行設定」切換鈕設為開啟,然後輸入「目標工作並行」。
按一下 [儲存]。
SQL
如要為新預訂設定並行上限目標,請使用 CREATE RESERVATION
DDL 陳述式,並設定 target_job_concurrency
欄位。
前往 Google Cloud 控制台的「BigQuery」頁面。
在查詢編輯器中輸入下列陳述式:
CREATE RESERVATION `ADMIN_PROJECT_ID.LOCATION.RESERVATION_NAME` OPTIONS ( target_job_concurrency = CONCURRENCY);
取代下列項目:
-
ADMIN_PROJECT_ID
:擁有預留項目的專案 -
LOCATION
:預訂地點,例如region-us
-
RESERVATION_NAME
:預留項目名稱 -
CONCURRENCY
:並行目標上限
-
按一下「執行」
。
如要進一步瞭解如何執行查詢,請參閱「執行互動式查詢」。
bq
如要為新預訂項目設定並行目標上限,請執行 bq mk
指令:
bq mk \ --project_id=ADMIN_PROJECT_ID \ --location=LOCATION \ --target_job_concurrency=CONCURRENCY \ --reservation \ RESERVATION_NAME
更改下列內容:
ADMIN_PROJECT_ID
:擁有預留項目的專案LOCATION
:預訂地點CONCURRENCY
:並行目標上限RESERVATION_NAME
:預留項目名稱
API
如要在 BigQuery Reservation API 中設定並行上限目標,請在預留資源中設定 concurrency
欄位,然後呼叫 CreateReservationRequest
方法。
更新並行上限目標
您隨時可以更新預訂的並行上限目標。 不過,提高目標值不保證系統會同時執行更多查詢。實際的並行情況取決於可用的運算資源。如果降低並行目標上限,目前執行的查詢不會受到影響,而排隊的查詢則會等到並行查詢數量低於新目標時才會執行。
如果將並行數量上限目標設為 0,BigQuery 會根據可用資源動態決定並行數量 (預設行為)。
必要的角色
如要取得更新預訂項目最大並行目標所需的權限,請要求管理員在保有承諾的管理專案中,授予您 BigQuery 資源編輯者 (roles/bigquery.resourceEditor
) IAM 角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
這個預先定義角色具備 bigquery.reservations.update
權限,可更新預訂的並行上限目標。
如要進一步瞭解 BigQuery 中的 IAM 角色,請參閱預先定義的角色與權限一文。
更新保留項目的最大並行目標
選取下列選項之一:
主控台
前往 Google Cloud 控制台的「BigQuery」頁面。
在導覽選單中,按一下「容量管理」。
按一下「運算單元預留項目」分頁標籤。
找出要更新的預訂。
展開「動作」
選項。按一下 [編輯]。
如要展開「進階設定」部分,請按一下
展開箭頭。如要設定目標工作並行,請將「覆寫自動目標工作並行設定」切換鈕設為開啟,然後輸入「目標工作並行」。
按一下 [儲存]。
SQL
如要更新現有預留項目的並行上限目標,請使用 ALTER RESERVATION
DDL 陳述式,並設定 target_job_concurrency
欄位。
前往 Google Cloud 控制台的「BigQuery」頁面。
在查詢編輯器中輸入下列陳述式:
ALTER RESERVATION `ADMIN_PROJECT_ID.LOCATION.RESERVATION_NAME` SET OPTIONS ( target_job_concurrency = CONCURRENCY);
取代下列項目:
-
ADMIN_PROJECT_ID
:擁有預留項目的專案 -
LOCATION
:預訂地點,例如region-us
-
RESERVATION_NAME
:預留項目名稱 -
CONCURRENCY
:並行目標上限
-
按一下「執行」
。
如要進一步瞭解如何執行查詢,請參閱「執行互動式查詢」。
bq
如要更新現有預訂的並行上限目標,請執行 bq update
指令:
bq update \ --project_id=ADMIN_PROJECT_ID \ --location=LOCATION \ --target_job_concurrency=CONCURRENCY \ --reservation \ RESERVATION_NAME
更改下列內容:
ADMIN_PROJECT_ID
:擁有預留項目的專案LOCATION
:預訂地點CONCURRENCY
:並行目標上限RESERVATION_NAME
:預留項目名稱
API
如要在 BigQuery Reservation API 中更新最大並行目標,請在預留資源中設定 concurrency
欄位,然後呼叫 UpdateReservationRequest
方法。
監控
如要瞭解哪些查詢正在執行,哪些查詢已加入佇列,請查看 INFORMATION_SCHEMA.JOBS_BY_*
和 INFORMATION_SCHEMA.JOBS_TIMELINE_BY_*
檢視畫面。state
欄位會針對正在執行的查詢設為 RUNNING
,並針對已加入佇列的查詢設為 PENDING
。
如要查看過去一天中,每秒達到動態並行閾值時執行的並行查詢數量,請執行下列查詢:
SELECT t1.period_start, t1.job_count AS dynamic_concurrency_threshold FROM ( SELECT period_start, state, COUNT(DISTINCT job_id) AS job_count FROM `PROJECT_ID.REGION_ID`.INFORMATION_SCHEMA.JOBS_TIMELINE WHERE period_start BETWEEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY) AND CURRENT_TIMESTAMP() AND reservation_id = "RESERVATION_ID" GROUP BY period_start, state) AS t1 JOIN ( SELECT period_start, state, COUNT(DISTINCT job_id) AS job_count FROM `PROJECT_ID.REGION_ID`.INFORMATION_SCHEMA.JOBS_TIMELINE WHERE state = "PENDING" AND period_start BETWEEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY) AND CURRENT_TIMESTAMP() AND reservation_id = "RESERVATION_ID" GROUP BY period_start, state HAVING COUNT(DISTINCT job_id) > 0 ) AS t2 ON t1.period_start = t2.period_start WHERE t1.state = "RUNNING";
更改下列內容:
PROJECT_ID
:您執行查詢的專案名稱REGION_ID
:處理查詢的位置RESERVATION_ID
:查詢執行的預訂名稱
您可以使用 BigQuery 管理資源圖表,選取「待處理」指標的「工作並行」圖表,監控預留項目的查詢佇列長度。

您也可以在 Cloud Monitoring 中查看工作計數指標,並依待處理狀態的工作數量進行篩選,藉此監控佇列長度。

限制
- 每個隨需專案一次最多可將 1,000 個互動式查詢和 20,000 個批次查詢加入佇列。如果查詢超出這項限制,系統會傳回配額錯誤。這些限制無法提高。
- 在預留項目中,指派給該預留項目的每個專案一次最多可將 1,000 個互動式查詢和 20,000 個批次查詢排入佇列。如果查詢超出這項限制,系統會傳回配額錯誤。這些限制無法提高。
- 根據預設,如果查詢工作未在 6 小時內開始執行 (互動式查詢) 或 24 小時內開始執行 (批次查詢),就會逾時。
- 您無法為以量計價專案中執行的查詢設定並行數上限目標。
- 如果查詢是透過 Standard 版預訂執行,您就無法設定查詢的並行目標上限。如要進一步瞭解版本,請參閱「BigQuery 版本簡介」。
後續步驟
- 進一步瞭解如何診斷及解決查詢佇列限制錯誤。