使用 BigQuery 高级运行时

本文档介绍了如何启用和停用 BigQuery 高级运行时,以及如何评估高级运行时对查询性能的影响。

角色与权限

如需获得指定配置设置所需的权限,请让您的管理员为您授予项目或组织的 BigQuery Admin (roles/bigquery.admin) IAM 角色。 如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

您也可以通过自定义角色或其他预定义角色来获取所需的权限。

特性

在 BigQuery 项目中启用高级运行时,即可在查询处理器中开启相关功能,从而在不产生额外费用的情况下缩短查询延迟时间并减少槽消耗量。

增强型矢量化

矢量化执行是一种查询处理模型,可对与 CPU 缓存大小对齐的数据块中的数据列进行操作,并使用单指令多数据 (SIMD) 指令。增强型矢量化功能将 BigQuery 中的矢量化查询执行扩展到查询处理的以下方面:

  • 通过利用 Capacitor 存储格式中的专用数据编码,可以对编码后的数据执行过滤条件评估操作。
  • 专用编码会通过查询计划进行传播,从而可以在数据仍处于编码状态时处理更多数据。
  • 通过实现表达式折叠来评估确定性函数和常量表达式,BigQuery 可以将复杂的谓词简化为常量值。

短查询优化

BigQuery 通常会在分布式环境中使用 Shuffle 中间层来执行查询。短查询优化功能可动态识别可以作为单个阶段运行的查询,从而缩短延迟时间并减少槽消耗。当查询在单个阶段运行时,可以更有效地使用专用编码。与可选作业创建模式搭配使用时,这些优化效果最为显著,因为该模式可最大限度地缩短作业启动、维护和结果检索延迟时间。

短查询优化功能的适用条件是动态变化的,受以下因素的影响:

  • 数据扫描的预测大小。
  • 所需的数据迁移量。
  • 查询过滤条件的选择性。
  • 存储空间中数据的类型和物理布局。
  • 查询的总体结构。
  • 过去查询执行的历史统计信息

启用高级运行时

如需为项目或组织启用高级运行时,请使用 ALTER PROJECTALTER ORGANIZATION 语句更改默认配置。在该语句中,将 query_runtime 实参设置为 'advanced'。例如:

ALTER PROJECT PROJECT_NAME
SET OPTIONS (
  `region-LOCATION.query_runtime` = 'advanced'
);

替换以下内容:

  • PROJECT_NAME:项目的名称
  • LOCATION:项目的位置

更改可能需要几分钟才能生效。

启用高级运行时后,项目或组织中的符合条件的查询会使用高级运行时,无论查询作业由哪个用户创建都是如此。

停用高级运行时

如需为项目或组织停用高级运行时,请使用 ALTER PROJECTALTER ORGANIZATION 语句更改默认配置。在该语句中,将 query_runtime 实参设置为 NULL。例如:

ALTER PROJECT PROJECT_NAME
SET OPTIONS (
  `region-LOCATION.query_runtime` = NULL
);

替换以下内容:

  • PROJECT_NAME:项目的名称
  • LOCATION:项目的位置

更改可能需要几分钟才能生效。

评估查询性能

您可以使用管理作业浏览器INFORMATION_SCHEMA 视图来评估高级运行时对查询执行时间和 slot 使用情况的影响。

请按照以下步骤评估启用和未启用高级运行时时的查询性能:

  1. 在 Google Cloud 控制台中,前往 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中打开新标签页。

  3. 停用相应查询标签页的缓存查询结果

  4. 在查询标签页中输入或复制测试查询。

  5. 运行测试查询几次,以确定基准性能。 每次运行后,按如下方式确定查询性能指标:

    1. 在管理作业探索器中查看查询执行详情
    2. 在新的查询标签页中运行以下查询,从 INFORMATION_SCHEMA.JOBS_BY_USER 视图 中检索作业效果数据:

      SELECT
          job_id,
          end_time - start_time AS duration,
          total_slot_ms,
          query
      FROM
        `region-us`.INFORMATION_SCHEMA.JOBS_BY_USER
      WHERE
          creation_time > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
          AND job_type='QUERY'
          AND total_slot_ms IS NOT NULL
      ORDER BY
          creation_time DESC,
          query ASC
      LIMIT 1000;
      
  6. 启用高级运行时

  7. 重复第 5 步。

  8. 比较启用高级运行时之前和之后测试查询的查询延迟时间和 slot 使用情况指标。