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 |
作业的类型。可以是 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 |
(分区列)此作业的创建时间。分区基于此时间戳的世界协调时间 (UTC)。 |
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 |
选定时间段内的 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;
+---------------------+---------------+ | 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
视图,以每小时为间隔查询槽用量时间轴,类似于管理资源图表中提供的信息。
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 `user_proj.region-US`.INFORMATION_SCHEMA.JOBS_TIMELINE_BY_ORGANIZATION 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, "^user_proj:") ) GROUP BY period_start, time_ms ), data_by_time AS ( SELECT time_ms, SUM(period_slot_ms) / (3600000 * 1) AS submetric_value FROM snapshot_data GROUP BY time_ms ) SELECT time_ms, IFNULL(submetric_value, 0) AS submetric_value, "Slot Usage" AS resource_id, IFNULL(SUM(submetric_value) OVER () / (TIMESTAMP_DIFF(@end_time, @start_time, HOUR) / 1), 0) AS overall_average_slot_count 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;