JOBS_TIMELINE 檢視畫面
INFORMATION_SCHEMA.JOBS_TIMELINE
檢視畫面包含目前專案中提交的所有工作,以時間切片為單位,提供近乎即時的 BigQuery 中繼資料。這個檢視畫面會顯示目前執行中和已完成的工作。
所需權限
如要查詢 INFORMATION_SCHEMA.JOBS_TIMELINE
檢視畫面,您需要專案的
bigquery.jobs.listAll
Identity and Access Management (IAM) 權限。
下列預先定義的 IAM 角色都包含必要權限:
- 專案擁有者
- BigQuery 管理員
如要進一步瞭解 BigQuery 權限,請參閱「使用身分與存取權管理功能控管存取權」一文。
結構定義
查詢 INFORMATION_SCHEMA.JOBS_TIMELINE_BY_*
檢視表時,查詢結果會針對每項 BigQuery 工作執行期間的每秒,各列出一個相對應的資料列。每個週期都從整秒間隔開始,且持續時間正好為一秒。
INFORMATION_SCHEMA.JOBS_TIMELINE_BY_*
檢視表具有下列結構定義:
資料欄名稱 | 資料類型 | 值 |
---|---|---|
period_start |
TIMESTAMP |
這個期間的開始時間。 |
period_slot_ms |
INTEGER |
這段期間消耗的運算單元時間 (毫秒)。 |
project_id |
STRING |
(叢集資料欄) 專案 ID。 |
project_number |
INTEGER |
專案編號。 |
user_email |
STRING |
(叢集資料欄) 執行工作的使用者電子郵件地址或服務帳戶。 |
job_id |
STRING |
工作 ID。例如 bquxjob_1234 。 |
job_type |
STRING |
工作類型,可以是 QUERY 、LOAD 、EXTRACT 、COPY 或 NULL 。NULL 值表示背景工作。 |
statement_type |
STRING |
查詢陳述式類型 (如有效)。例如 SELECT 、INSERT 、UPDATE 或 DELETE 。 |
priority |
STRING |
這項工作的優先順序。有效值包括 INTERACTIVE 和 BATCH 。 |
parent_job_id |
STRING |
父項工作的 ID (如有)。 |
job_creation_time |
TIMESTAMP |
(分區資料欄) 這項工作的建立時間。分區依據是這個時間戳記的世界標準時間。 |
job_start_time |
TIMESTAMP |
這項工作的開始時間。 |
job_end_time |
TIMESTAMP |
這項工作的結束時間。 |
state |
STRING |
這段期間結束時,工作的執行狀態。有效狀態包括 PENDING 、RUNNING 和 DONE 。 |
reservation_id |
STRING |
如果適用,這個期間結束時指派給這項工作的主要預留項目名稱。 |
edition |
STRING |
與指派給這項工作的預留項目相關聯的版本。如要進一步瞭解版本,請參閱「BigQuery 版本簡介」。 |
total_bytes_billed |
INTEGER |
如果專案設定為使用依用量計價,這個欄位會顯示作業的總計費位元組數。如果專案已設為使用固定費率定價,系統就不會針對位元組收費,這個欄位僅供參考。 |
total_bytes_processed |
INTEGER |
工作處理的位元組總數。 |
error_result |
RECORD |
錯誤詳細資料 (如有),以
ErrorProto.
形式呈現 |
cache_hit |
BOOLEAN |
這項工作的查詢結果是否來自快取。 |
period_shuffle_ram_usage_ratio |
FLOAT |
所選時間範圍內的重組用量比率。 |
period_estimated_runnable_units |
INTEGER |
這段期間可立即排定的工作單元。如果預訂中的其他查詢不需要額外運算單元,這些作業單元的額外運算單元就能加快查詢速度。 |
transaction_id |
STRING |
這項工作執行的交易 ID (如有)。(預覽) |
資料保留
這個檢視畫面會顯示目前執行的工作,以及過去 180 天的工作記錄。
範圍和語法
對這個檢視表執行的查詢必須包含區域限定詞。如未指定地區限定符,系統會從所有地區擷取中繼資料。下表說明這個檢視畫面的區域範圍:
檢視表名稱 | 資源範圍 | 區域範圍 |
---|---|---|
[PROJECT_ID.]`region-REGION`.INFORMATION_SCHEMA.JOBS_TIMELINE[_BY_PROJECT] |
專案層級 | REGION |
-
選用:
PROJECT_ID
:您的 Google Cloud 專案 ID。如未指定,系統會使用預設專案。 -
REGION
:任何資料集區域名稱。 例如:`region-us`
。
範例
如要對預設專案以外的專案執行查詢,請使用以下格式新增專案 ID:
`PROJECT_ID`.`region-REGION_NAME`.INFORMATION_SCHEMA.VIEW
`myproject`.`region-us`.INFORMATION_SCHEMA.JOBS_TIMELINE
。
以下範例會計算過去 1 天內每秒鐘的運算單元用量:
SELECT period_start, SUM(period_slot_ms) AS total_slot_ms, FROM `reservation-admin-project.region-us`.INFORMATION_SCHEMA.JOBS_TIMELINE WHERE period_start BETWEEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY) AND CURRENT_TIMESTAMP() GROUP BY period_start ORDER BY period_start DESC;
+---------------------+---------------+ | period_start | total_slot_ms | +---------------------+---------------+ | 2020-07-29 03:52:14 | 122415176 | | 2020-07-29 03:52:15 | 141107048 | | 2020-07-29 03:52:16 | 173335142 | | 2020-07-28 03:52:17 | 131107048 | +---------------------+---------------+
您可以使用 WHERE reservation_id = "…"
檢查特定預留項目的用量。如果是指令碼工作,父項工作也會回報子項工作的總計使用配額。為避免重複計算,請使用 WHERE statement_type != "SCRIPT"
排除父項工作。
示例:一段時間內的 RUNNING
和 PENDING
工作數量
如要對預設專案以外的專案執行查詢,請使用以下格式新增專案 ID:
`PROJECT_ID`.`region-REGION_NAME`.INFORMATION_SCHEMA.VIEW
`myproject`.`region-us`.INFORMATION_SCHEMA.JOBS_TIMELINE
。
下列範例會計算過去一天內每秒的 RUNNING
和 PENDING
工作數量:
SELECT period_start, SUM(IF(state = "PENDING", 1, 0)) as PENDING, SUM(IF(state = "RUNNING", 1, 0)) as RUNNING FROM `reservation-admin-project.region-us`.INFORMATION_SCHEMA.JOBS_TIMELINE WHERE period_start BETWEEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY) AND CURRENT_TIMESTAMP() GROUP BY period_start;
結果大致如下:
+---------------------+---------+---------+ | period_start | PENDING | RUNNING | +---------------------+---------+---------+ | 2020-07-29 03:52:14 | 7 | 27 | | 2020-07-29 03:52:15 | 1 | 21 | | 2020-07-29 03:52:16 | 5 | 21 | | 2020-07-29 03:52:17 | 4 | 22 | +---------------------+---------+---------+
範例:特定時間點的工作資源用量
如要對預設專案以外的專案執行查詢,請使用以下格式新增專案 ID:
`PROJECT_ID`.`region-REGION_NAME`.INFORMATION_SCHEMA.VIEW
`myproject`.`region-us`.INFORMATION_SCHEMA.JOBS
。
以下範例會傳回特定時間點執行的所有工作,以及該一秒期間的資源用量:job_id
SELECT job_id, period_slot_ms FROM `reservation-admin-project.region-us`.INFORMATION_SCHEMA.JOBS_TIMELINE_BY_PROJECT WHERE period_start = '2020-07-29 03:52:14' AND statement_type != 'SCRIPT';
結果大致如下:
+------------------+ | job_id | slot_ms | +------------------+ | job_1 | 2415176 | | job_2 | 4417245 | | job_3 | 427416 | | job_4 | 1458122 | +------------------+
範例:從管理資源圖表比對時段使用行為
您可以使用管理資源圖表,監控機構的健康狀態、運算單元用量,以及 BigQuery 工作在一段時間內的效能。以下範例會查詢 INFORMATION_SCHEMA.JOBS_TIMELINE
檢視區塊,取得每小時的時段用量時間軸,與管理資源圖表中的資訊類似。
DECLARE start_time timestamp DEFAULT TIMESTAMP(START_TIME); DECLARE end_time timestamp DEFAULT TIMESTAMP(END_TIME); WITH snapshot_data AS ( SELECT UNIX_MILLIS(period_start) AS period_start, IFNULL(SUM(period_slot_ms), 0) AS period_slot_ms, DIV(UNIX_MILLIS(period_start), 3600000 * 1) * 3600000 * 1 AS time_ms FROM ( SELECT * FROM `PROJECT_ID.region-US`.INFORMATION_SCHEMA.JOBS_TIMELINE_BY_PROJECT WHERE ((job_creation_time >= TIMESTAMP_SUB(start_time, INTERVAL 1200 MINUTE) AND job_creation_time < TIMESTAMP(end_time)) AND period_start >= TIMESTAMP(start_time) AND period_start < TIMESTAMP(end_time)) AND (statement_type != "SCRIPT" OR statement_type IS NULL) AND REGEXP_CONTAINS(reservation_id, "^PROJECT_ID:") ) GROUP BY period_start, time_ms ), converted_percentiles_data AS ( SELECT time_ms, 100 - CAST(SAFE_DIVIDE(3600000 * 1 * 1 / 1000, COUNT(*)) AS INT64) AS converted_percentiles, FROM snapshot_data GROUP BY time_ms ), data_by_time AS ( SELECT time_ms, IF (converted_percentiles <= 0, 0, APPROX_QUANTILES(period_slot_ms, 100)[SAFE_OFFSET(converted_percentiles)] / 1000) AS p99_slots, SUM(period_slot_ms) / (3600000 * 1) AS avg_slots FROM snapshot_data JOIN converted_percentiles_data AS c USING (time_ms) GROUP BY time_ms, converted_percentiles ) SELECT time_ms, TIMESTAMP_MILLIS(time_ms) AS time_stamp, IFNULL(avg_slots, 0) AS avg_slots, IFNULL(p99_slots, 0) AS p99_slots, FROM ( SELECT time_ms * 3600000 * 1 AS time_ms FROM UNNEST(GENERATE_ARRAY(DIV(UNIX_MILLIS(start_time), 3600000 * 1), DIV(UNIX_MILLIS(end_time), 3600000 * 1) - 1, 1)) AS time_ms ) LEFT JOIN data_by_time USING (time_ms) ORDER BY time_ms DESC;