使用查詢佇列

BigQuery 會自動判斷可同時執行的查詢數量,稱為「動態並行」。其他查詢會排入佇列,直到處理資源可供使用為止。本文件說明如何控管並行目標上限,以及設定互動式和批次查詢的佇列逾時時間。

總覽

BigQuery 會根據可用的運算資源,動態決定可同時執行的查詢數量。系統會根據每個隨選專案或預留計算可同時執行的查詢數量。其他查詢會排入佇列,直到有足夠的容量可開始執行為止。無論專案是按需使用或使用預留空間,佇列長度都會限制為每個區域的每個專案有 1,000 個互動式查詢和 20,000 個批次查詢。以下範例說明計算的查詢並行處理作業為 202 時,按需專案的行為:

202 個並行查詢,接著是排隊查詢,然後是傳回錯誤的查詢。

對於保留項目,您可以選擇設定並行處理目標數量上限,也就是在保留項目中可同時執行的查詢數量上限,以確保為每項查詢分配一些運算單元數量下限。您無法為按需專案指定並行運算目標上限,系統會動態計算這項值。

排隊行為

BigQuery 會強制執行公平排程,確保沒有任何單一專案可以使用保留項目中的所有運算單元。

系統會先從並行處理比率最低的專案中,將查詢從佇列中移除。執行期間,系統會先將運算單元平均分配給各項專案,再平均分配給專案中的各項工作。

舉例來說,假設您有一個保留項目,已指派給兩個專案:A 和 B。BigQuery 會針對保留項目並行運算,計算出 5 個。專案 A 有四個同時執行的查詢,專案 B 有一個執行中的查詢,其他查詢則排入佇列。即使是從專案 B 提交的查詢,也會先從佇列中移除,查詢開始執行後,會在共用預留空間中獲得公平分配的時間段。

除了並行查詢總數之外,BigQuery 也會動態判斷每個按需專案或預留項目可執行的並行批次查詢數量上限。如果同時執行的批次查詢數量達到這個上限,系統會優先處理互動查詢,即使這些查詢是在稍後提交也一樣。

刪除預留項目後,所有排隊中的查詢都會逾時。當指派給預留項目的專案重新指派給其他預留項目時,所有已排入佇列或執行中的要求會繼續在舊預留項目中執行,而所有新要求則會轉移至新預留項目。當指派給保留項目的專案從保留項目中移除時,保留項目會繼續執行查詢,而新要求和排隊中的要求則會使用以量計價模式執行。您可以選擇取消個別執行中或排入佇列的查詢工作。

控制佇列逾時

如要控制互動式或批次查詢的佇列逾時時間,請使用 ALTER PROJECT SET OPTIONS 陳述式ALTER ORGANIZATION SET OPTIONS 陳述式,在專案或組織的預設設定中設定 default_interactive_query_queue_timeout_msdefault_batch_query_queue_timeout_ms 欄位。

如要查看專案中互動式或批次查詢的佇列逾時時間,請查詢 INFORMATION_SCHEMA.EFFECTIVE_PROJECT_OPTIONS 檢視畫面

如要停用佇列功能,請將佇列逾時時間設為 -1。如果達到查詢並行作業數上限,則其他查詢會失敗,並顯示 ADMISSION_DENIED 錯誤。

設定並行處理數量上限

您可以在建立預訂時手動設定並行數量上限。根據預設,並行數量上限為零,表示 BigQuery 會根據可用資源動態決定並行數量。否則,如果您設定的目標值不為零,最高並行處理目標會指定在預留狀態下同時執行的查詢數量上限,確保每個執行的查詢可用的下限時段容量。

即使提高並行上限,系統也不一定會同時執行更多查詢。實際並行情況取決於可用的運算資源,您可以透過在預訂中新增更多時段來增加運算資源。

必要的角色

如要取得在新的預留空間中設定並行作業所需的權限,請管理員在管理專案中授予您 BigQuery 資源編輯者 (roles/bigquery.resourceEditor) IAM 角色,以便維護承諾的擁有權。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。

這個預先定義的角色包含 bigquery.reservations.create 權限,這是在新的預留動作中設定並行作業所需的權限。

您或許還可透過自訂角色或其他預先定義的角色取得此權限。

如要進一步瞭解 BigQuery 中的 IAM 角色,請參閱「預先定義的角色與權限」一文。

設定保留項目的並行作業上限目標

選取下列選項之一:

主控台

  1. 前往 Google Cloud 控制台的「BigQuery」頁面。

    前往 BigQuery

  2. 在導覽選單中,按一下「Capacity management」(容量管理)

  3. 按一下「Create reservation」(建立預留項目)

  4. 選取預訂設定

  5. 如要展開「進階設定」部分,請按一下 展開箭頭。

  6. 如要設定目標工作並行設定,請按一下「覆寫自動目標工作並行設定」切換鈕,然後輸入「目標工作並行設定」

  7. 按一下 [儲存]

SQL

如要為新預訂設定並行數上限,請使用 CREATE RESERVATION DDL 陳述式,並設定 target_job_concurrency 欄位

  1. 前往 Google Cloud 控制台的「BigQuery」頁面。

    前往 BigQuery

  2. 在查詢編輯器中輸入以下陳述式:

    CREATE RESERVATION `ADMIN_PROJECT_ID.LOCATION.RESERVATION_NAME`
      OPTIONS (
        target_job_concurrency = CONCURRENCY);

    請依指示取代下列項目:

    • ADMIN_PROJECT_ID:保留訂單的專案
    • LOCATION:預訂位置,例如 region-us
    • RESERVATION_NAME:預訂名稱
    • CONCURRENCY:並行處理的目標上限

  3. 按一下 「Run」

如要進一步瞭解如何執行查詢,請參閱「執行互動式查詢」一文。

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) 身分與存取權管理角色,以便維護承諾的擁有權。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。

這個預先定義的角色包含 bigquery.reservations.update 權限,這是更新預留作業的最大並行處理目標所需的權限。

您或許還可透過自訂角色或其他預先定義的角色取得此權限。

如要進一步瞭解 BigQuery 中的 IAM 角色,請參閱「預先定義的角色與權限」一文。

更新保留項目的並行數量上限目標

選取下列選項之一:

主控台

  1. 前往 Google Cloud 控制台的「BigQuery」頁面。

    前往 BigQuery

  2. 在導覽選單中,按一下「Capacity management」(容量管理)

  3. 按一下「Slot reservations」(運算單元保留) 分頁標籤。

  4. 找出要更新的預訂。

  5. 展開 「Actions」 選項。

  6. 按一下 [編輯]

  7. 如要展開「進階設定」部分,請按一下 展開箭頭。

  8. 如要設定目標工作並行設定,請按一下「覆寫自動目標工作並行設定」切換鈕,然後輸入「目標工作並行設定」

  9. 按一下 [儲存]

SQL

如要更新現有預訂的並行處理上限,請使用 ALTER RESERVATION DDL 陳述式,並設定 target_job_concurrency 欄位

  1. 前往 Google Cloud 控制台的「BigQuery」頁面。

    前往 BigQuery

  2. 在查詢編輯器中輸入以下陳述式:

    ALTER RESERVATION `ADMIN_PROJECT_ID.LOCATION.RESERVATION_NAME`
    SET OPTIONS (
      target_job_concurrency = CONCURRENCY);

    請依指示取代下列項目:

    • ADMIN_PROJECT_ID:保留訂單的專案
    • LOCATION:預訂位置,例如 region-us
    • RESERVATION_NAME:預訂名稱
    • CONCURRENCY:並行處理的目標上限

  3. 按一下 「Run」

如要進一步瞭解如何執行查詢,請參閱「執行互動式查詢」一文。

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 中更新最大並行處理目標,請在 reservation resource 中設定 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 管理資源圖表,選取含有指標「Pending」的「Job Concurrency」圖表,監控保留項目的查詢佇列長度。

管理資源圖表中的佇列長度。

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

Cloud Monitoring 中的佇列長度。

限制

  • 每個隨選專案最多可同時排入 1,000 個互動式查詢和 20,000 個批次查詢。超過此上限的查詢會傳回配額錯誤。您無法要求提高這些限制。
  • 在保留項目中,指派給該保留項目的每個專案最多可同時排入 1,000 個互動式查詢和 20,000 個批次查詢。超過此上限的查詢會傳回配額錯誤。您無法要求提高這些限制。
  • 根據預設,未開始執行的查詢工作會在 6 小時後 (互動式查詢) 和 24 小時後 (批次查詢) 逾時。
  • 您無法為在隨選專案中執行的查詢設定並行數量目標上限。
  • 您無法為使用 Standard 版預留空間的查詢設定並行目標上限。如要進一步瞭解版本,請參閱「BigQuery 版本簡介」。

後續步驟