JOBS 视图
INFORMATION_SCHEMA.JOBS
视图包含当前项目中所有 BigQuery 作业的实时元数据。
所需角色
如需获得查询 INFORMATION_SCHEMA.JOBS
视图所需的权限,请让您的管理员授予您项目的 BigQuery Resource Viewer (roles/bigquery.resourceViewer
) IAM 角色。如需详细了解如何授予角色,请参阅管理访问权限。
此预定义角色包含 bigquery.jobs.listAll
权限,查询 INFORMATION_SCHEMA.JOBS
视图需要该权限。您也可以使用自定义角色或其他预定义角色来获取此权限。
如需详细了解 BigQuery 权限,请参阅使用 IAM 进行访问权限控制。
架构
底层数据按 creation_time
列进行分区,并按 project_id
和 user_email
进行聚簇。
INFORMATION_SCHEMA.JOBS
视图具有如下架构:
列名 | 数据类型 | 值 |
---|---|---|
creation_time |
TIMESTAMP |
(分区列)此作业的创建时间。分区基于此时间戳的世界协调时间 (UTC)。 |
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 或 SCRIPT 。如需查看有效值的列表,请参阅 QueryStatementType。 |
priority |
STRING |
此作业的优先级。 有效值包括 INTERACTIVE 和 BATCH 。 |
start_time |
TIMESTAMP |
此作业的开始时间。 |
end_time |
TIMESTAMP |
此作业的结束时间。 |
query |
STRING |
SQL 查询文本。注意:只有 JOBS_BY_PROJECT 视图具有 query 列。 |
state |
STRING |
作业的运行状态。有效状态包括 PENDING 、RUNNING 、DONE 。 |
reservation_id |
STRING |
分配给此作业的主要预留的名称(如果适用的话)。如果作业在已分配给预留的项目中运行,其采用以下格式:RESERVATION_ADMIN_PROJECT:RESERVATION_LOCATION.RESERVATION_NAME 。在此输出中:
|
total_bytes_processed |
INTEGER |
作业处理的字节总数。 |
total_slot_ms |
INTEGER |
作业在其整个时间段内的槽毫秒数。 |
error_result |
RECORD |
错误的详细信息(如有),为 ErrorProto 。 |
cache_hit |
BOOLEAN |
查询此作业的查询结果是否来自缓存。 |
destination_table |
RECORD |
结果的目标表(如有)。 |
referenced_tables |
RECORD |
作业引用的表数组。 仅针对查询作业进行填充。 |
labels |
RECORD |
作为 key 和 value 字符串应用于作业的标签数组。 |
timeline |
RECORD |
作业的查询时间轴。包含查询执行情况的快照。 |
job_stages |
RECORD |
作业的查询阶段。 |
total_bytes_billed |
INTEGER |
如果项目配置为使用按需价格,则此字段包含作业的总计费字节数。如果项目配置为使用固定价格,则您无需为字节付费,并且此字段仅供参考。 |
parent_job_id |
STRING |
父级作业的 ID(如有)。 |
transaction_id |
STRING |
此作业在其中运行的事务的 ID(如果有)。(预览版) |
session_info |
RECORD |
运行此作业的会话的详细信息(如果有)。(预览版) |
dml_statistics |
RECORD |
如果作业是带有 DML 语句的查询,则值是包含以下字段的记录:
对于所有其他作业,值为
|
bi_engine_statistics |
RECORD |
如果项目配置为使用 BI Engine SQL 接口,则此字段包含 BiEngineStatistics。否则为 NULL 。 |
total_modified_partitions |
INTEGER |
作业修改的分区总数。系统会针对 LOAD 和 QUERY 作业填充此字段。 |
数据保留
此视图包含当前正在运行的作业和过去 180 天的作业历史记录。
范围和语法
针对此视图的查询必须包含区域限定符。如果您未指定区域限定符,则会从所有区域检索元数据。下表说明了此视图的区域范围:
视图名称 | 资源范围 | 区域范围 |
---|---|---|
[PROJECT_ID.]`region-REGION`.INFORMATION_SCHEMA.JOBS[_BY_PROJECT] |
项目级 | REGION |
- 可选:
PROJECT_ID
:您的 Cloud 项目的 ID。如果未指定,则使用默认项目。 REGION
:任何数据集区域名称。例如region-us
。
当您查询 INFORMATION_SCHEMA.JOBS
以查找查询作业的汇总费用时,请排除 SCRIPT
语句类型,否则某些值会被重复计算。SCRIPT
行包含在此作业中执行的所有子作业的汇总值。
示例
如需对非默认项目运行查询,请按以下格式添加项目 ID:
`PROJECT_ID`.`region-REGION_NAME`.INFORMATION_SCHEMA.JOBS替换以下内容:
PROJECT_ID
:项目的 ID。REGION_NAME
:项目的区域。
例如 `myproject`.`region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
。
以下示例会计算指定项目在过去 7 天内所有查询的平均槽利用率。请注意,此计算对于在一周内槽使用量一致的项目最为准确。如果项目的槽使用量不一致,则此数字可能会低于预期。
要运行查询,请执行以下操作:
SELECT SUM(total_slot_ms) / (1000 * 60 * 60 * 24 * 7) AS avg_slots FROM `region-us`.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 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)
。
示例:加载作业历史记录
以下示例会列出针对指定项目提交批量加载作业的所有用户或服务帐号。由于未指定时间边界,因此该查询会扫描所有可用历史记录(例如,过去 30 天)。
SELECT DISTINCT(user_email) AS user FROM `region-us`.INFORMATION_SCHEMA.JOBS WHERE job_type = 'LOAD';
结果类似于以下内容:
+--------------+ | user | +--------------+ | abc@xyz.com | +--------------+ | def@xyz.com | +--------------+
示例:每个用户身份处理的字节数
以下示例显示了每个用户的查询作业结算的总字节数。
SELECT
user_email,
SUM(total_bytes_billed) AS bytes_billed
FROM
`region-us.INFORMATION_SCHEMA.JOBS`
WHERE
job_type = 'QUERY'
AND statement_type != 'SCRIPT'
GROUP BY
user_email;
结果应如下所示:
+---------------------+--------------+
| 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-us`.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 20:00:00 UTC | 10485760 | | 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 my_project.`region-us`.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 | | my_project | dataset2 | sales | 30 | | other_proj | dataset1 | accounts | 12 | +------------+------------+----------+----------------+