「工作」檢視畫面
INFORMATION_SCHEMA.JOBS
檢視畫面會顯示目前專案中所有 BigQuery 工作近乎即時的中繼資料。
必要角色
如要取得查詢 INFORMATION_SCHEMA.JOBS
檢視畫面所需的權限,請要求管理員為您授予專案的 BigQuery 資源檢視者 (roles/bigquery.resourceViewer
) 身分與存取權管理角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
這個預先定義的角色包含 bigquery.jobs.listAll
權限,這是查詢 INFORMATION_SCHEMA.JOBS
檢視畫面所需的權限。
如要進一步瞭解 BigQuery 權限,請參閱「使用身分與存取權管理功能控管存取權」。
結構定義
基礎資料會依 creation_time
資料欄分區,並依 project_id
和 user_email
分群。query_info
欄包含查詢工作的其他資訊。
INFORMATION_SCHEMA.JOBS
檢視表具有下列結構定義:
資料欄名稱 | 資料類型 | 值 |
---|---|---|
bi_engine_statistics |
RECORD |
如果專案已設定為使用 BI Engine,則這個欄位會包含 BiEngineStatistics。否則為 NULL 。 |
cache_hit |
BOOLEAN |
這個工作是否來自快取的查詢結果。如果您有多項查詢陳述式工作,則父項查詢的 cache_hit 為 NULL 。 |
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 |
工作類型。可以是 QUERY 、LOAD 、EXTRACT 、COPY 或 NULL 。NULL 值表示內部工作,例如指令碼工作陳述式評估。 |
labels |
RECORD |
以鍵/值組合形式套用至工作的標籤陣列。 |
parent_job_id |
STRING |
父項工作 ID (如果有的話)。 |
priority |
STRING |
這項工作的優先順序。有效值包括 INTERACTIVE 和 BATCH 。 |
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 。輸出內容:
|
edition |
STRING |
與指派給此工作的預留項目相關聯的版本。如要進一步瞭解版本,請參閱「BigQuery 版本簡介」。 |
session_info |
RECORD |
執行這項工作的工作階段詳細資料 (如有)。 |
start_time |
TIMESTAMP |
這個工作的開始時間,自紀元時間後的毫秒數。這個欄位代表工作從 PENDING 狀態轉換為 RUNNING 或 DONE 的時間。 |
state |
STRING |
此工作的執行狀態。有效的狀態包括 PENDING 、RUNNING 和 DONE 。 |
statement_type |
STRING |
查詢陳述式的類型。例如 DELETE 、INSERT 、SCRIPT 、SELECT 或 UPDATE 。如需有效值清單,請參閱 QueryStatementType。 |
timeline |
RECORD |
工作查詢時間軸。包含查詢執行作業的快照。 |
total_bytes_billed |
INTEGER |
如果專案已設定為使用依用量計價,則這個欄位會包含工作所產生的總位元組數。如果專案已設為使用固定費率定價,則系統不會針對位元組收費,這個欄位僅供參考。 注意:如果查詢是從具有資料列層級存取政策的資料表讀取,這個欄的值會為空白。詳情請參閱「BigQuery 資料列層級安全防護機制的最佳做法」。 |
total_bytes_processed |
INTEGER |
工作處理的位元組總數。 注意:如果查詢是從具有資料列層級存取政策的資料表讀取,這個欄的值會為空白。詳情請參閱「BigQuery 資料列層級安全防護機制的最佳做法」。 |
total_modified_partitions |
INTEGER |
工作修改的分區總數。系統會為 LOAD 和 QUERY 工作填入這個欄位。 |
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 月推出。
用於工作的查詢方言。有效值包括:
這個欄位僅會填入查詢工作。您可以透過設定控制預設的查詢方言選項。 |
continuous |
BOOLEAN |
工作是否為持續查詢。 |
continuous_query_info.output_watermark |
TIMESTAMP |
代表持續查詢已成功處理資料的點。 |
vector_search_statistics |
RECORD |
向量搜尋查詢的統計資料。 |
當您查詢 INFORMATION_SCHEMA.JOBS
以查看查詢工作的摘要成本時,請排除 SCRIPT
陳述式類型,否則某些值可能會被計入兩次。SCRIPT
列包含這項工作執行的所有子項工作的摘要值。
多陳述式查詢工作
多陳述式查詢工作是使用程序式語言的查詢工作。多陳述式查詢工作通常會使用 DECLARE
定義變數,或包含 IF
或 WHILE
等控制流程陳述式。查詢 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;
+-------------+------------+-------------+----------+-----------------+ |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...| +------------+--------------------------+------------------+-------------------------------------+
查詢長時間執行作業的清單
以下範例列出了超過 30 分鐘處於 RUNNING
或 PENDING
狀態的長時間執行工作:
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 | +-----------+---------------------------------+-----------------------+---------------+
取得資源警告的詳細資料
如果您收到「Resources exceeded」錯誤訊息,可以查詢特定時間範圍內的查詢:
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;
按日期分組監控資源警告
如果您收到「Resources exceeded」錯誤訊息,可以監控資源警告的總數,並按日期分組,瞭解工作負載是否有任何變化:
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_id
就是 NULL
。
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 | +--------------+---------------------------+---------------------------------+
取得匯出工作處理的位元組數
以下範例會計算 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 資料表的用量
以下範例說明 BigLake Iceberg 資料表在 BigQuery 儲存空間最佳化功能中的用途。
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 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
檢視畫面。