JOBS_TIMELINE 视图

INFORMATION_SCHEMA.JOBS_TIMELINE 视图包含当前项目中提交的所有作业的近乎实时 BigQuery 元数据(按时间片划分)。此视图包含当前正在运行的作业和已完成的作业。

所需权限

如需查询 INFORMATION_SCHEMA.JOBS_TIMELINE 视图,您需要拥有项目的 bigquery.jobs.listAll Identity and Access Management (IAM) 权限。以下每个预定义的 IAM 角色均可提供所需的权限:

  • Project Owner
  • BigQuery Admin

如需详细了解 BigQuery 权限,请参阅使用 IAM 进行访问权限控制

架构

当您查询 INFORMATION_SCHEMA.JOBS_TIMELINE_BY_* 视图时,每个 BigQuery 作业的每秒执行都会有一行对应的查询结果。每个时间段均以 1 秒为间隔,且刚好持续 1 秒。

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 (分区列)此作业的创建时间。分区基于此时间戳的世界协调时间 (UTC)。
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 选定时间段内的 shuffle 使用率。
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

以下示例计算了过去一天中每秒的槽利用率:

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' OR statement_type IS NULL);

结果类似于以下内容:

+------------------+
| 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;

计算有待处理工作的执行时间所占的百分比

如需对非默认项目运行查询,请按以下格式添加项目 ID:

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

以下示例返回一个浮点值,表示 period_estimated_runnable_units 的值不为零(即作业请求更多槽)的总作业执行时长所占的百分比。值较大表示作业受到槽争用的影响,而值较小表示作业在大部分执行时间里都没有请求槽,这意味着几乎没有槽争用。

如果结果值较大,您可以尝试添加更多槽,看看效果如何,并了解槽争用是否是唯一的瓶颈。

SELECT ROUND(COUNTIF(period_estimated_runnable_units > 0) / COUNT(*) * 100, 1) as execution_duration_percentage
FROM `myproject`.`region-us`.INFORMATION_SCHEMA.JOBS_TIMELINE
WHERE job_id = 'my_job_id'
GROUP BY job_id

如果您知道查询的执行日期,请向查询添加 DATE(period_start) = 'YYYY-MM-DD' 子句,以减少处理的字节数并加快执行速度。例如:DATE(period_start) = '2025-08-22'

结果类似于以下内容:

+-------------------------------+
| execution_duration_percentage |
+-------------------------------+
|                          96.7 |
+-------------------------------+