「JOBS」檢視畫面

INFORMATION_SCHEMA.JOBS」檢視畫面包含目前專案中所有 BigQuery 工作的近乎即時中繼資料。

必要角色

如要取得查詢 INFORMATION_SCHEMA.JOBS 檢視畫面所需的權限,請要求管理員授予您專案的 BigQuery 資源檢視者 (roles/bigquery.resourceViewer) 身分與存取權管理角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。

這個預先定義的角色具備 bigquery.jobs.listAll 權限,這是查詢 INFORMATION_SCHEMA.JOBS 檢視畫面時的必要權限。

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

如要進一步瞭解 BigQuery 權限,請參閱「使用身分與存取權管理功能控管存取權」一文。

結構定義

基礎資料會依 creation_time 資料欄分區,並依 project_iduser_email 分群。「query_info」欄包含查詢工作的其他資訊。

INFORMATION_SCHEMA.JOBS 檢視表具有下列結構定義:

資料欄名稱 資料類型
bi_engine_statistics RECORD 如果專案已設定為使用 BI Engine,這個欄位會包含 BiEngineStatistics。否則為 NULL
cache_hit BOOLEAN 這項工作的查詢結果是否來自快取。 如果您有多重查詢陳述式工作,則父項查詢的 cache_hitNULL
creation_time TIMESTAMP (分區資料欄) 這項工作的建立時間。分區依據是這個時間戳記的世界標準時間。
destination_table RECORD 結果的目標資料表 (如有)。
end_time TIMESTAMP 這項工作的結束時間,自訓練週期後的毫秒數。這個欄位代表工作進入 DONE 狀態的時間。
error_result RECORD ErrorProto 物件形式呈現的任何錯誤詳細資料。
job_creation_reason.code STRING 指定建立工作的概略原因。
可能的值包括:
job_id STRING 如果已建立工作,則為工作 ID。否則,請使用「選擇性建立工作」模式查詢的查詢 ID。例如 bquxjob_1234
job_stages RECORD 這項工作的查詢階段

注意:如果查詢是從設有資料列層級存取政策的資料表讀取資料,這個資料欄的值會是空白。詳情請參閱 BigQuery 資料列層級安全防護最佳做法

job_type STRING 工作類型,可以是 QUERYLOADEXTRACTCOPYNULLNULL 值表示背景工作。
labels RECORD 以鍵/值組合形式套用至工作的標籤陣列。
parent_job_id STRING 父項工作的 ID (如有)。
priority STRING 這項工作的優先順序。有效值包括 INTERACTIVEBATCH
project_id STRING (叢集資料欄) 專案的 ID。
project_number INTEGER 專案編號。
query STRING SQL 查詢文字。只有 JOBS_BY_PROJECT 檢視畫面有查詢資料欄。
referenced_tables RECORD 工作參照的資料表陣列。只有非快取命中查詢作業會有這項資料。
reservation_id STRING 指派給這項工作的主要預留項目名稱,格式為 RESERVATION_ADMIN_PROJECT:RESERVATION_LOCATION.RESERVATION_NAME
輸出內容:
  • RESERVATION_ADMIN_PROJECT:管理預訂的 Google Cloud 專案名稱
  • RESERVATION_LOCATION:預訂地點
  • RESERVATION_NAME:預留項目名稱
edition STRING 與指派給這項工作的預留項目相關聯的版本。如要進一步瞭解版本,請參閱「BigQuery 版本簡介」。
session_info RECORD 如果有的話,這項工作執行的工作階段詳細資料。
start_time TIMESTAMP 這項工作的開始時間,自記錄週期後的毫秒數。這個欄位代表工作從 PENDING 狀態轉換為 RUNNINGDONE 的時間。
state STRING 此工作的執行狀態。有效狀態包括 PENDINGRUNNINGDONE
statement_type STRING 查詢陳述式類型。例如 DELETEINSERTSCRIPTSELECTUPDATE。如需有效值清單,請參閱 QueryStatementType
timeline RECORD 這項工作的查詢時間軸。包含查詢執行作業的快照。
total_bytes_billed INTEGER 如果專案設定為使用依用量計價,這個欄位會顯示作業的總計費位元組數。如果專案已設為使用固定費率價格,系統就不會針對位元組收費,這個欄位僅供參考。

注意:如果查詢是從設有資料列層級存取政策的資料表讀取資料,這個資料欄的值會是空白。詳情請參閱 BigQuery 資料列層級安全防護最佳做法

total_bytes_processed INTEGER

工作處理的位元組總數。

注意:如果查詢是從設有資料列層級存取政策的資料表讀取資料,這個資料欄的值會是空白。詳情請參閱 BigQuery 資料列層級安全防護最佳做法

total_modified_partitions INTEGER 工作修改的分區總數。這個欄位會填入 LOADQUERY 工作。
total_slot_ms INTEGER 工作在 RUNNING 狀態的整個期間內,包括重試,所用的運算單元毫秒數。
transaction_id STRING 這項工作執行的交易 ID (如有)。(預覽)
user_email STRING (叢集資料欄) 執行作業的使用者電子郵件地址或服務帳戶。
query_info.resource_warning STRING 如果查詢處理期間的資源用量超過系統內部門檻,就會顯示警告訊息。
如果查詢工作成功,resource_warning 欄位就會填入資料。使用 resource_warning 可取得額外資料點,有助於最佳化查詢,並使用 query_hashes 設定同等查詢集的成效趨勢監控。
query_info.query_hashes.normalized_literals STRING 包含查詢的雜湊。normalized_literals 是十六進位 STRING 雜湊,會忽略註解、參數值、UDF 和常值。如果基礎檢視區塊變更,或查詢隱含參照資料欄 (例如 SELECT *),且資料表結構定義變更,雜湊值就會不同。
這個欄位會顯示成功的 GoogleSQL 查詢,但不會顯示快取命中。
query_info.performance_insights RECORD 工作的效能深入分析
query_info.optimization_details STRUCT 這項工作的歷史記錄最佳化
transferred_bytes INTEGER 跨雲端查詢 (例如 BigQuery Omni 跨雲端移轉工作) 的總移轉位元組數。
materialized_view_statistics RECORD 查詢作業中考量的具體化檢視表統計資料。(預覽)
metadata_cache_statistics RECORD 查詢工作所參照資料表的中繼資料欄索引使用統計資料
search_statistics RECORD 搜尋查詢的統計資料。
query_dialect STRING 這個欄位將於 2025 年 5 月推出。 用於工作的查詢方言。有效值包括:
  • GOOGLE_SQL:這項作業要求使用 GoogleSQL。
  • LEGACY_SQL:工作要求使用舊版 SQL。
  • DEFAULT_LEGACY_SQL:工作要求中未指定查詢方言。 BigQuery 使用 LegacySQL 的預設值。
  • DEFAULT_GOOGLE_SQL:工作要求中未指定查詢方言。 BigQuery 使用 GoogleSQL 的預設值。

這個欄位只會填入查詢工作。您可以透過設定控制查詢方言的預設選取項目。
continuous BOOLEAN 工作是否為持續查詢
continuous_query_info.output_watermark TIMESTAMP 代表持續查詢成功處理資料的點。
vector_search_statistics RECORD 向量搜尋查詢的統計資料。

查詢 INFORMATION_SCHEMA.JOBS 以找出查詢工作的摘要費用時,請排除 SCRIPT 陳述式類型,否則部分值可能會重複計算。SCRIPT 列包含所有子項工作的摘要值,這些子項工作是這項工作的一部分。

多陳述式查詢工作

多重陳述式查詢工作是指使用程序語言的查詢工作。多重陳述式查詢工作通常會使用 DECLARE 定義變數,或包含控制流程陳述式,例如 IFWHILE。查詢 INFORMATION_SCHEMA.JOBS 時,您可能需要瞭解多重陳述式查詢工作和其他工作的差異。多重陳述式查詢工作具有下列特徵:

  • statement_type = SCRIPT
  • reservation_id = NULL

子項工作

多重陳述式查詢工作的每個子工作都有 parent_job_id,指向多重陳述式查詢工作本身。包括所有做為這項工作一部分執行的子項工作的摘要值。

如果您查詢 INFORMATION_SCHEMA.JOBS 是為了找出查詢工作的摘要費用,則應排除 SCRIPT 陳述式類型。否則,系統可能會重複計算部分值,例如 total_slot_ms

資料保留

這個檢視畫面會顯示目前執行的工作,以及過去 180 天的工作記錄。

範圍和語法

對這個檢視表執行的查詢必須包含區域限定詞。下表說明這個檢視畫面的區域範圍:

檢視表名稱 資源範圍 區域範圍
[PROJECT_ID.]`region-REGION`.INFORMATION_SCHEMA.JOBS[_BY_PROJECT] 專案層級 REGION
取代下列項目:
  • 選用:PROJECT_ID:您的 Google Cloud 專案 ID。如未指定,系統會使用預設專案。
  • REGION:任何資料集區域名稱。 例如:`region-us`

範例

如要對預設專案以外的專案執行查詢,請使用以下格式新增專案 ID:

`PROJECT_ID`.`region-REGION_NAME`.INFORMATION_SCHEMA.JOBS
取代下列項目:

  • PROJECT_ID:專案的 ID。
  • REGION_NAME:專案的區域。

例如 `myproject`.`region-us-central1`.INFORMATION_SCHEMA.JOBS

比較以量計價的工作用量與帳單資料

如果專案採用以量計價方案,您可以使用 INFORMATION_SCHEMA.JOBS 檢視畫面,查看特定期間的運算費用。

如果專案採用以容量為準 (配額) 的定價,您可以使用 INFORMATION_SCHEMA.RESERVATIONS_TIMELINE 查看特定期間的運算費用。

下列查詢會產生每日預估的帳單 TiB 總計,以及由此產生的費用。「限制」一節說明這些預估值可能與帳單不符的情況。

僅限這個範例,您必須設定下列其他變數。您可以在這裡編輯這些項目,方便日後使用。

  • START_DATE:最早的匯總日期 (含)。
  • END_DATE:要匯總的最新日期 (含)。
  • PRICE_PER_TIB:用於帳單預估的每 TiB 以量計價
CREATE TEMP FUNCTION isBillable(error_result ANY TYPE)
AS (
  -- You aren't charged for queries that return an error.
  error_result IS NULL
  -- However, canceling a running query might incur charges.
  OR error_result.reason = 'stopped'
);

-- BigQuery hides the number of bytes billed on all queries against tables with
-- row-level security.
CREATE TEMP FUNCTION isMaybeUsingRowLevelSecurity(
  job_type STRING, tib_billed FLOAT64, error_result ANY TYPE)
AS (
  job_type = 'QUERY'
  AND tib_billed IS NULL
  AND isBillable(error_result)
);

WITH
  query_params AS (
    SELECT
      date 'START_DATE' AS start_date,  -- inclusive
      date 'END_DATE' AS end_date,  -- inclusive
  ),
  usage_with_multiplier AS (
    SELECT
      job_type,
      error_result,
      creation_time,
      -- Jobs are billed by end_time in PST8PDT timezone, regardless of where
      -- the job ran.
      EXTRACT(date FROM end_time AT TIME ZONE 'PST8PDT') billing_date,
      total_bytes_billed / 1024 / 1024 / 1024 / 1024 total_tib_billed,
      CASE statement_type
        WHEN 'SCRIPT' THEN 0
        WHEN 'CREATE_MODEL' THEN 50 * PRICE_PER_TIB
        ELSE PRICE_PER_TIB
        END AS multiplier,
    FROM `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS
  )
SELECT
  billing_date,
  sum(total_tib_billed * multiplier) estimated_charge,
  sum(total_tib_billed) estimated_usage_in_tib,
  countif(isMaybeUsingRowLevelSecurity(job_type, total_tib_billed, error_result))
    AS jobs_using_row_level_security,
FROM usage_with_multiplier, query_params
WHERE
  1 = 1
  -- Filter by creation_time for partition pruning.
  AND date(creation_time) BETWEEN date_sub(start_date, INTERVAL 2 day) AND end_date
  AND billing_date BETWEEN start_date AND end_date
  AND isBillable(error_result)
GROUP BY billing_date
ORDER BY billing_date;

限制

  • BigQuery 會隱藏部分統計資料,以供查詢具有資料列層級安全防護機制的資料表。提供的查詢會計算受影響的作業數量 (如 jobs_using_row_level_security 所示),但無法存取可計費用量。

  • BigQuery ML 以量計價的查詢費用取決於建立的模型類型。INFORMATION_SCHEMA.JOBS 不會追蹤建立的模型類型,因此提供的查詢會假設所有 CREATE_MODEL 陳述式都建立較高費用的模型類型。

  • Apache Spark 程序採用類似的定價模式,但費用會以 BigQuery Enterprise 版隨用隨付 SKU 形式回報。INFORMATION_SCHEMA.JOBS 會將這項用量記錄為 total_bytes_billed,但無法判斷用量代表哪個 SKU。

計算平均運算單元用量

以下範例會計算特定專案在過去 7 天內,所有查詢的平均運算單元用量。請注意,如果專案在一週內使用的時段數一致,這項計算結果就會最準確。如果專案的運算單元用量不穩定,這個數字可能會低於預期。

執行查詢:

SELECT
  SUM(total_slot_ms) / (1000 * 60 * 60 * 24 * 7) AS avg_slots
FROM
  `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS
WHERE
  -- Filter by the partition column first to limit the amount of data scanned.
  -- Eight days allows for jobs created before the 7 day end_time filter.
  creation_time BETWEEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 8 DAY) AND CURRENT_TIMESTAMP()
  AND job_type = 'QUERY'
  AND statement_type != 'SCRIPT'
  AND end_time BETWEEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY) AND CURRENT_TIMESTAMP();

結果大致如下:

+------------+
| avg_slots  |
+------------+
| 3879.1534  |
+------------+

您可以使用 WHERE reservation_id = "…" 檢查特定預留項目的用量。這有助於判斷一段時間內保留項目的使用百分比。如果是指令碼工作,父項工作也會回報子項工作的總運算單元用量。為避免重複計算,請使用 WHERE statement_type != "SCRIPT" 排除父項工作。

如要檢查個別作業的平均空位使用率,請改用 total_slot_ms / TIMESTAMP_DIFF(end_time, start_time, MILLISECOND)

依查詢優先順序計算近期執行中的查詢次數

以下範例會顯示過去 7 小時內啟動的查詢數量,並依優先順序 (互動式或批次) 分組:

SELECT
  priority,
  COUNT(*) active_jobs
FROM
  `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS
WHERE
  creation_time > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 hour)
  AND job_type = 'QUERY'
GROUP BY priority;

結果大致如下:

+-------------+-------------+
| priority    | active_jobs |
+-------------+-------------+
| INTERACTIVE |           2 |
| BATCH       |           3 |
+-------------+-------------+

priority 欄位會指出查詢是 INTERACTIVE 還是 BATCH

查看載入工作記錄

以下範例會列出為特定專案提交批次載入工作的所有使用者或服務帳戶。由於未指定時間界線,這項查詢會掃描所有可用的記錄。

SELECT
  user_email AS user,
  COUNT(*) num_jobs
FROM
  `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS
WHERE
  job_type = 'LOAD'
GROUP BY
  user_email;

結果類似下列畫面:

+--------------+
| user         |
+--------------+
| abc@xyz.com  |
| xyz@xyz.com  |
| bob@xyz.com  |
+--------------+

取得載入工作數量,判斷每日工作配額用量

以下範例會依據日期、資料集和資料表傳回工作數量,方便您判斷每日工作配額的使用量。

SELECT
    DATE(creation_time) as day,
    destination_table.project_id as project_id,
    destination_table.dataset_id as dataset_id,
    destination_table.table_id as table_id,
    COUNT(job_id) AS load_job_count
 FROM
   `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS
 WHERE
    creation_time BETWEEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 8 DAY) AND CURRENT_TIMESTAMP()
    AND job_type = "LOAD"
GROUP BY
    day,
    project_id,
    dataset_id,
    table_id
ORDER BY
    day DESC;
注意:`INFORMATION_SCHEMA` 檢視表名稱會區分大小寫。 結果類似下列畫面:
+-------------+------------+-------------+----------+-----------------+
|day          | project_id | dataset_id  | table_id | load_job_count  |
+-------------+------------+-------------+----------+-----------------+
| 2020-10-10  | my_project | dataset1    | orders   | 58              |
| 2020-10-10  | my_project | dataset1    | product  | 20              |
| 2020-10-10  | my_project | dataset1    | sales    | 11              |
+-------------+------------+-------------+----------+-----------------+

取得最近幾項失敗的工作

以下範例顯示最近三項失敗的工作:

SELECT
   job_id,
  creation_time,
  user_email,
   error_result
 FROM `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE
  error_result.reason != "Null"
ORDER BY
  creation_time DESC
LIMIT 3;

結果應如下所示:

+------------+--------------------------+------------------+-------------------------------------+
| job_id     | creation_time            | user_email       | error_result                        |
+------------+--------------------------+------------------+-------------------------------------+
| bquxjob_1  | 2020-10-10 00:00:00 UTC  | abc@example.com  | Column 'col1' has mismatched type...|
| bquxjob_2  | 2020-10-11 00:00:00 UTC  | xyz@example.com  | Column 'col1' has mismatched type...|
| bquxjob_3  | 2020-10-11 00:00:00 UTC  | bob@example.com  | Column 'col1' has mismatched type...|
+------------+--------------------------+------------------+-------------------------------------+

查詢長時間執行的作業清單

以下範例顯示處於 RUNNINGPENDING 狀態超過 30 分鐘的長期執行工作清單:

SELECT
  job_id,
  job_type,
  state,
  creation_time,
  start_time,
  user_email
 FROM `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS
 WHERE
  state!="DONE" AND
  creation_time <= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 MINUTE)
ORDER BY
  creation_time ASC;

結果大致如下:

+--------+----------+---------+--------------------------------+--------------------------------+------------------+
| job_id | job_type | state   | creation_time                  | start_time                     | user_email       |
+--------+----------+---------+--------------------------------+--------------------------------+------------------+
| bquxjob_1  | QUERY    | RUNNING | 2023-05-03 05:07:22.818000 UTC | 2023-05-03 05:07:22.905000 UTC | abc@example.com  |
| bquxjob_2  | QUERY    | PENDING | 2023-05-01 02:05:47.925000 UTC | 2023-05-01 02:05:47.998000 UTC | xyz@example.com  |
| bquxjob_3  | QUERY    | PENDING | 2023-05-01 02:05:47.925000 UTC | 2023-05-01 02:05:47.998000 UTC | abc@example.com  |
+--------+----------+---------+--------------------------------+--------------------------------+------------------+

使用「選擇性建立工作」模式的查詢

以下範例顯示在選用工作建立模式中執行的查詢清單,BigQuery 未為這些查詢建立工作。

SELECT
 job_id,
FROM
 `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS
WHERE
 TIMESTAMP_TRUNC(creation_time, DAY) = '2024-06-12'
 AND job_creation_reason.code IS NULL
LIMIT 3;

結果應如下所示:

+-----------+
| job_id    |                                          |
+-----------+
| bquxjob_1 |
| bquxjob_2 |
| bquxjob_3 |
+-----------+

以下範例顯示在選用工作建立模式中執行的查詢相關資訊,BigQuery 並未為該查詢建立工作。

SELECT
 job_id,
 statement_type,
 priority,
 cache_hit,
 job_creation_reason.code AS job_creation_reason_code,
 total_bytes_billed,
 total_bytes_processed,
 total_slot_ms,
 state,
 error_result.message AS error_result_message,
FROM
 `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS
WHERE
 TIMESTAMP_TRUNC(creation_time, DAY) = '2024-06-12'
 AND job_id = '2Lm09bHxDEsoVK8zwzWJomLHU_Ud%1910479b151' -- queryId

注意:如果系統未針對查詢建立工作,job_id 欄位會包含查詢的 queryId

結果應如下所示:

+-----------+----------------+-------------+-----------+--------------------------+--------------------+---------------------+---------------+-------+----------------------+
| job_id    | statement_type | priority    | cache_hit | job_creation_reason_code | total_bytes_billed | total_bytes_processed | total_slot_ms | state | error_result_message |
+-----------+----------------+-------------+-----------+--------------------------+--------------------+---------------------+---------------+-------+----------------------+
| bquxjob_1 | SELECT         | INTERACTIVE | false     | null                     | 161480704          | 161164718             | 3106          | DONE  | null                 |
+-----------+----------------+-------------+-----------+--------------------------+--------------------+---------------------+---------------+-------+----------------------+

以下範例顯示在選用工作建立模式中執行的查詢清單,BigQuery 已為這些查詢建立工作。

SELECT
 job_id,
 job_creation_reason.code AS job_creation_reason_code
FROM
 `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS
WHERE
 TIMESTAMP_TRUNC(creation_time, DAY) = '2024-06-12'
 AND job_creation_reason.code IS NOT NULL
 AND job_creation_reason.code != 'REQUESTED'
LIMIT 3

結果應如下所示:

+-----------+--------------------------+
| job_id    | job_creation_reason_code |
+-----------+--------------------------+
| bquxjob_1 | LARGE_RESULTS            |
| bquxjob_2 | LARGE_RESULTS            |
| bquxjob_3 | LARGE_RESULTS            |
+-----------+--------------------------+

每個使用者身分處理的位元組數

以下範例顯示每位使用者的查詢工作計費位元組總數:

SELECT
  user_email,
  SUM(total_bytes_billed) AS bytes_billed
FROM
  `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS
WHERE
  job_type = 'QUERY'
  AND statement_type != 'SCRIPT'
GROUP BY
  user_email;

注意:請參閱JOBS 檢視區塊的結構定義說明文件,瞭解 total_bytes_billed 欄的注意事項。

結果應如下所示:

+---------------------+--------------+
| user_email          | bytes_billed |
+---------------------+--------------+
| bob@example.com     | 2847932416   |
| alice@example.com   | 1184890880   |
| charles@example.com | 10485760     |
+---------------------+--------------+

每小時處理的位元組數明細

以下範例顯示查詢作業的計費位元組總數,間隔為一小時:

SELECT
  TIMESTAMP_TRUNC(end_time, HOUR) AS time_window,
  SUM(total_bytes_billed) AS bytes_billed
FROM
  `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS
WHERE
  job_type = 'QUERY'
  AND statement_type != 'SCRIPT'
GROUP BY
  time_window
ORDER BY
  time_window DESC;

結果大致如下:

+-------------------------+--------------+
| time_window             | bytes_billed |
+-------------------------+--------------+
| 2022-05-17 20:00:00 UTC | 1967128576   |
| 2022-05-10 21:00:00 UTC | 0            |
| 2022-04-15 17:00:00 UTC | 41943040     |
+-------------------------+--------------+

每個資料表的查詢工作

以下範例顯示查詢作業參照 my_project 中每個資料表的次數:

SELECT
  t.project_id,
  t.dataset_id,
  t.table_id,
  COUNT(*) AS num_references
FROM
  `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS, UNNEST(referenced_tables) AS t
GROUP BY
  t.project_id,
  t.dataset_id,
  t.table_id
ORDER BY
  num_references DESC;

結果大致如下:

+------------+------------+----------+----------------+
| project_id | dataset_id | table_id | num_references |
+------------+------------+----------+----------------+
| my_project | dataset1   | orders   | 58             |
| my_project | dataset1   | products | 40             |
| other_proj | dataset1   | accounts | 12             |
+------------+------------+----------+----------------+

每個專案的舊版 SQL 查詢工作數

INFORMATION_SCHEMA 中的「query_dialect」欄位將於 2025 年 5 月推出。以下範例顯示專案執行的舊版 SQL 查詢作業數量。

SELECT
  project_id,
  -- Implicitly defaulted to LegacySQL since the query dialect was not specified
  -- in the request.
  COUNTIF(query_dialect = 'DEFAULT_LEGACY_SQL') AS default_legacysql_query_jobs,
  -- Explicitly requested LegacySQL.
  COUNTIF(query_dialect = 'LEGACY_SQL') AS legacysql_query_jobs,
FROM
  `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS
WHERE
  query_dialect = 'DEFAULT_LEGACY_SQL'
  OR query_dialect = 'LEGACY_SQL'
GROUP BY
  project_id
ORDER BY
  default_legacysql_query_jobs DESC,
  legacysql_query_jobs DESC;

每個資料表透過查詢和載入工作修改的分區數

以下範例顯示每個資料表透過 DML 陳述式和載入工作修改的分區數量。請注意,這項查詢不會顯示複製工作的 total_modified_partitions

SELECT
  destination_table.table_id,
  SUM(total_modified_partitions) AS total_modified_partitions
FROM
  `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS
WHERE
  DATE(creation_time, "America/Los_Angeles") = CURRENT_DATE()
GROUP BY
  table_id
ORDER BY
  total_modified_partitions DESC

工作每毫秒使用的平均運算單元數

以下範例說明如何計算作業在執行期間使用的平均時段數。這有助於排解查詢速度緩慢的問題,以及比較同一查詢的緩慢執行與快速執行。將這個值與預訂總大小,以及專案或預訂中執行的並行工作平均數進行比較,有助於瞭解執行期間是否有數個查詢同時爭奪時段。

平均空位數越高,表示分配給作業的資源越多,通常執行速度也會越快。

SELECT ROUND(SAFE_DIVIDE(total_slot_ms,TIMESTAMP_DIFF(end_time, start_time, MILLISECOND)), 1) as avg_slots_per_ms
FROM `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE job_id = 'JOB_ID'

JOB_ID 替換為您要調查的 job_id

結果類似於下列畫面:

+------------------+
| avg_slots_per_ms |
+------------------+
|             17.0 |
+------------------+

依專案列出費用最高的查詢

以下範例會列出 my_project 中依據時段使用時間排序,成本最高的查詢:

SELECT
 job_id,
 query,
 user_email,
 total_slot_ms
FROM `my_project`.`region-REGION_NAME`.INFORMATION_SCHEMA.JOBS
WHERE EXTRACT(DATE FROM  creation_time) = current_date()
ORDER BY total_slot_ms DESC
LIMIT 3

您也可以根據處理的資料量列出費用最高的查詢,請參考以下範例:

SELECT
 job_id,
 query,
 user_email,
 total_bytes_processed
FROM `my_project`.`region-REGION_NAME`.INFORMATION_SCHEMA.JOBS
WHERE EXTRACT(DATE FROM  creation_time) = current_date()
ORDER BY total_bytes_processed DESC
LIMIT 3

任一範例的結果都類似於下列內容:

+-----------+---------------------------------+-----------------------+---------------+
| job_id    | query                           | user_email            | total_slot_ms |
+-----------+---------------------------------+--------------------------+------------+
| bquxjob_1 | SELECT ... FROM dataset.table1  | bob@example.com       | 80,000        |
| bquxjob_2 | SELECT ... FROM dataset.table2  | alice@example.com     | 78,000        |
| bquxjob_3 | SELECT ... FROM dataset.table3  | charles@example.com   | 75,000        |
+-----------+---------------------------------+-----------------------+---------------+

取得資源警告的詳細資料

如果收到「資源超出上限」錯誤訊息,可以查詢時間範圍內的查詢:

SELECT
  query,
  query_info.resource_warning
FROM
  `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS
WHERE
 creation_time BETWEEN TIMESTAMP("2022-12-01")
 AND TIMESTAMP("2022-12-08")
 AND query_info.resource_warning IS NOT NULL
LIMIT 3;

依日期分組監控資源警告

如果收到「資源超出上限」錯誤訊息,可以監控依日期分組的資源警告總數,瞭解工作負載是否有任何變更:

WITH resource_warnings AS (
  SELECT
    EXTRACT(DATE FROM creation_time) AS creation_date
  FROM
    `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS
  WHERE
    creation_time >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 14 DAY)
    AND query_info.resource_warning IS NOT NULL
)
SELECT
  creation_date,
  COUNT(1) AS warning_counts
FROM
  resource_warnings
GROUP BY creation_date
ORDER BY creation_date DESC;

估算查詢的運算單元用量和費用

以下範例使用 estimated_runnable_units 計算每個工作的平均和最大時段數。

如果沒有任何預訂項目,則 reservation_idNULL

SELECT
  project_id,
  job_id,
  reservation_id,
  EXTRACT(DATE FROM creation_time) AS creation_date,
  TIMESTAMP_DIFF(end_time, start_time, SECOND) AS job_duration_seconds,
  job_type,
  user_email,
  total_bytes_billed,

  -- Average slot utilization per job is calculated by dividing total_slot_ms by the millisecond duration of the job

  SAFE_DIVIDE(job.total_slot_ms,(TIMESTAMP_DIFF(job.end_time, job.start_time, MILLISECOND))) AS job_avg_slots,
  query,

  -- Determine the max number of slots used at ANY stage in the query.
  -- The average slots might be 55. But a single stage might spike to 2000 slots.
  -- This is important to know when estimating number of slots to purchase.

  MAX(SAFE_DIVIDE(unnest_job_stages.slot_ms,unnest_job_stages.end_ms - unnest_job_stages.start_ms)) AS jobstage_max_slots,

  -- Check if there's a job that requests more units of works (slots). If so you need more slots.
  -- estimated_runnable_units = Units of work that can be scheduled immediately.
  -- Providing additional slots for these units of work accelerates the query,
  -- if no other query in the reservation needs additional slots.

  MAX(unnest_timeline.estimated_runnable_units) AS estimated_runnable_units
FROM `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS AS job
  CROSS JOIN UNNEST(job_stages) as unnest_job_stages
  CROSS JOIN UNNEST(timeline) AS unnest_timeline
WHERE project_id = 'my_project'
  AND statement_type != 'SCRIPT'
  AND DATE(creation_time) BETWEEN DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY) AND CURRENT_DATE()
GROUP BY 1,2,3,4,5,6,7,8,9,10
ORDER BY job_id;

結果類似下列內容:

+-----------+-----------+----------------+---------------+----------------------+----------+-----------------+--------------------+--------------+--------------------------------+--------------------+--------------------------+
|project_id | job_id    | reservation_id | creation_date | job_duration_seconds | job_type | user_email      | total_bytes_billed | job_avg_slots| query                          | jobstage_max_slots | estimated_runnable_units |
+-----------+-----------+----------------+---------------+----------------------+----------+-----------------+--------------------+--------------+--------------------------------+--------------------+--------------------------+
| project1  | bquxjob1  | reservation1   | 2020-10-10    | 160                  | LOAD     | abc@example.com | 161480704          | 2890         | SELECT ... FROM dataset.table1 | 2779.1534          | 8293                     |
| project1  | bquxjob2  | reservation2   | 2020-12-10    | 120                  | LOAD     | abc@example.com | 161480704          | 2890         | SELECT ... FROM dataset.table1 | 2779.1534          | 8768                     |
| project1  | bquxjob3  | reservation1   | 2020-12-10    | 120                  | LOAD     | abc@example.com | 161480704          | 2890         | SELECT ... FROM dataset.table1 | 1279.1534          | 8738                     |
+-----------+-----------+----------------+---------------+----------------------+----------+-----------------+--------------------+--------------+--------------------------------+--------------------+--------------------------+

查看查詢的成效洞察資料

以下範例會傳回專案中過去 30 天內所有提供成效洞察的查詢作業,以及 Google Cloud 控制台中查詢執行圖的連結網址。

SELECT
  `bigquery-public-data`.persistent_udfs.job_url(
    project_id || ':us.' || job_id) AS job_url,
  query_info.performance_insights
FROM
  `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE
  DATE(creation_time) >= CURRENT_DATE - 30 -- scan 30 days of query history
  AND job_type = 'QUERY'
  AND state = 'DONE'
  AND error_result IS NULL
  AND statement_type != 'SCRIPT'
  AND EXISTS ( -- Only include queries which had performance insights
    SELECT 1
    FROM UNNEST(
      query_info.performance_insights.stage_performance_standalone_insights
    )
    WHERE slot_contention OR insufficient_shuffle_quota
    UNION ALL
    SELECT 1
    FROM UNNEST(
      query_info.performance_insights.stage_performance_change_insights
    )
    WHERE input_data_change.records_read_diff_percentage IS NOT NULL
  );

查看中繼資料重新整理工作

以下範例會列出過去六小時內的中繼資料重新整理工作:

SELECT
 *
FROM
 `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE
 job_id LIKE '%metadata_cache_refresh%'
 AND creation_time > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 6 HOUR)
ORDER BY start_time desc
LIMIT 10;

REGION_NAME 替換成您的區域。

分析相同查詢在不同時間的成效

下列範例會傳回過去 7 天內,執行相同查詢的前 10 個最慢工作:

DECLARE querytext STRING DEFAULT(
  SELECT query
  FROM `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS
  WHERE job_id = 'JOB_ID'
  LIMIT 1
);

SELECT
  start_time,
  end_time,
  project_id,
  job_id,
  TIMESTAMP_DIFF(end_time, start_time, SECOND) AS run_secs,
  total_bytes_processed / POW(1024, 3) AS total_gigabytes_processed,
  query
FROM
  `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS
WHERE
  query = querytext
  AND total_bytes_processed > 0
  AND creation_time >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
ORDER BY 5 DESC
LIMIT 3;

JOB_ID 替換為執行您要分析的查詢的任何 job_id

今天掃描最多位元組的前 5 項工作

以下範例說明如何找出機構在當天掃描最多位元組的五項工作。您可以在 statement_type 上進一步篩選,查詢負載、匯出和查詢等額外資訊。

SELECT
  job_id,
  user_email,
  total_bytes_billed
FROM
  `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS_BY_ORGANIZATION
WHERE
  EXTRACT(DATE FROM  creation_time) = current_date()
ORDER BY
  total_bytes_billed DESC
LIMIT 3;

結果大致如下:

+--------------+--------------+---------------------------+
| job_id       |  user_email  |  total_bytes_billed       |
+--------------+--------------+---------------------------+
| bquxjob_1    |  abc@xyz.com |    999999                 |
| bquxjob_2    |  def@xyz.com |    888888                 |
| bquxjob_3    |  ghi@xyz.com |    777777                 |
+--------------+--------------+---------------------------+

查看待處理或執行中的工作

SELECT
  job_id,
  creation_time,
  query
FROM
  `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS_BY_USER
WHERE
  state != 'DONE';

結果大致如下:

+--------------+---------------------------+---------------------------------+
| job_id       |  creation_time            |  query                          |
+--------------+---------------------------+---------------------------------+
| bquxjob_1    |  2019-10-10 00:00:00 UTC  |  SELECT ... FROM dataset.table1 |
| bquxjob_2    |  2019-10-10 00:00:01 UTC  |  SELECT ... FROM dataset.table2 |
| bquxjob_3    |  2019-10-10 00:00:02 UTC  |  SELECT ... FROM dataset.table3 |
+--------------+---------------------------+---------------------------------+

查看與特定工作在同一專案中執行的平均並行工作數

以下範例說明如何計算與同一專案中特定查詢工作同時執行的工作平均數量。

這項計算有助於判斷是否因同一專案中並行執行的工作數量增加,而導致配額爭用問題。排解查詢速度緩慢的問題,或是比較查詢執行速度緩慢和快速的情況時,請收集這項資料。

如果執行的並行查詢遠超出預期,請檢查是否啟動了更多工作、查詢的資料是否變更,或兩者皆是。

WITH job_metadata AS (
 SELECT creation_time, end_time, job_type
 FROM `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
 WHERE job_id = 'JOB_ID'
-- If you know the date the job was created, add the following line to speed up the query by providing the date in UTC:
-- AND DATE(creation_time) = 'YYYY-MM-DD'
),
intervals AS (
 SELECT TIMESTAMP_ADD(creation_time, INTERVAL (seconds_offset) SECOND) AS ts,
 job_type
 FROM job_metadata,
 UNNEST (GENERATE_ARRAY(0, IF(TIMESTAMP_DIFF(end_time, creation_time, SECOND) > 0, TIMESTAMP_DIFF(end_time, creation_time, SECOND), 1))) as seconds_offset
),
concurrent_jobs AS (
 SELECT int.ts, COUNT(*) as concurrent_jobs_count
 FROM intervals int JOIN
 `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS_BY_PROJECT j
 ON int.ts BETWEEN j.creation_time and j.end_time
 WHERE job_id != 'JOB_ID'
 AND j.job_type = int.job_type
 GROUP BY int.ts)

SELECT ROUND(AVG(concurrent_jobs_count),1) as average_concurrent_jobs FROM concurrent_jobs

更改下列內容:

  • JOB_ID:您要分析的查詢作業 ID

  • REGION_NAME:專案的區域

結果類似下列畫面:

+-------------------------+
| average_concurrent_jobs |
+-------------------------+
|                     2.8 |
+-------------------------+

取得匯出工作處理的位元組數

以下範例會計算 EXTRACT 工作類型的 total_bytes_processed 值。如要瞭解匯出工作配額,請參閱匯出工作配額政策。您可以根據處理的位元組總數監控匯總用量,並確認匯出工作是否未超過每日 50 TB 的限制:

SELECT
    DATE(creation_time) as day,
    project_id as source_project_id,
    SUM(total_bytes_processed) AS total_bytes_processed
 FROM
   `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS
 WHERE
    creation_time BETWEEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 8 DAY) AND CURRENT_TIMESTAMP()
    AND job_type = "EXTRACT"
GROUP BY
    day,
    source_project_id
ORDER BY
    day DESC;

取得複製工作的使用量

如要瞭解複製作業,請參閱「複製資料表」。 以下範例說明如何使用複製工作:

SELECT
    DATE(creation_time) as day,
    project_id as source_project_id,
CONCAT(destination_table.project_id,":",destination_table.dataset_id,".",destination_table.table_id) as destination_table,
    COUNT(job_id) AS copy_job_count
 FROM
   `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS
 WHERE
    creation_time BETWEEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 8 DAY) AND CURRENT_TIMESTAMP()
    AND job_type = "COPY"
GROUP BY
    day,
    source_project_id,
    destination_table
ORDER BY
    day DESC;

在 BigQuery 儲存空間最佳化中取得 Apache Iceberg 專用 BigLake 資料表的使用情形

以下範例說明如何在 BigQuery 儲存空間最佳化中使用 BigLake Iceberg 資料表。

SELECT
    job_id, reservation_id, edition,
    total_slot_ms, total_bytes_processed, state
FROM `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS
WHERE creation_time > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 6 HOUR)
    AND user_email = "bigquery-adminbot@system.gserviceaccount.com"
    AND query LIKE "CALL BQ.OPTIMIZE_STORAGE(%)";

在 BigQuery 匯出資料表的中繼資料中,取得 BigLake Iceberg 資料表的使用情形

以下範例說明如何使用 Iceberg EXPORT TABLE METADATA FROM

SELECT
   job_id,
   user_email,
   start_time,
   end_time,
   TIMESTAMP_DIFF(end_time, start_time, SECOND) AS duration_seconds,
   total_bytes_processed,
   reservation_id,
   CASE
     WHEN reservation_id IS NULL THEN 'PAYG (On-demand)'
     WHEN reservation_id != '' THEN 'Reservation'
     ELSE 'Unknown'
   END AS compute_type,
   query
 FROM
   `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS
 WHERE
   job_type = 'QUERY'
   AND end_time IS NOT NULL
   -- Filter for queries containing the specified pattern (case-insensitive)
   AND REGEXP_CONTAINS(LOWER(query), r"export table metadata from")
 ORDER BY
   start_time DESC
 LIMIT 3;

從管理資源圖表比對運算單元用量行為

如要探索與管理資源圖表資訊類似的時段用量行為,請查詢 INFORMATION_SCHEMA.JOBS_TIMELINE 檢視區塊