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 工作類型,可以是 QUERYLOADEXTRACTCOPYNULLNULL 值表示背景工作。
statement_type STRING 查詢陳述式類型 (如有效)。例如 SELECTINSERTUPDATEDELETE
priority STRING 這項工作的優先順序。有效值包括 INTERACTIVEBATCH
parent_job_id STRING 父項工作的 ID (如有)。
job_creation_time TIMESTAMP (分區資料欄) 這項工作的建立時間。分區依據是這個時間戳記的世界標準時間。
job_start_time TIMESTAMP 這項工作的開始時間。
job_end_time TIMESTAMP 這項工作的結束時間。
state STRING 這段期間結束時,工作的執行狀態。有效狀態包括 PENDINGRUNNINGDONE
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;
注意:`INFORMATION_SCHEMA` 檢視表名稱會區分大小寫。 結果類似於下列內容:
+---------------------+---------------+
|    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" 排除父項工作。

示例:一段時間內的 RUNNINGPENDING 工作數量

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

`PROJECT_ID`.`region-REGION_NAME`.INFORMATION_SCHEMA.VIEW
,例如 `myproject`.`region-us`.INFORMATION_SCHEMA.JOBS_TIMELINE

下列範例會計算過去一天內每秒的 RUNNINGPENDING 工作數量:

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;