BI Engine 简介

BigQuery BI Engine 是一项高速内存中分析服务,它可以智能地缓存最常使用的数据,从而加快 BigQuery 中的许多 SQL 查询的速度。BI Engine 可以加快来自任何来源(包括由数据可视化工具编写的查询)的 SQL 查询的速度,并且可以管理缓存表以进行持续优化。这样,您无需进行手动调整或数据分层即可提高查询性能。您可以对表进行聚簇分区,以进一步优化大型表的 BI Engine 性能。

例如,如果您的信息中心仅显示上季度的数据,您可以按时间对表进行分区,以便仅将最新的分区加载到内存中。您还可以结合具体化视图和 BI Engine 的优势。当具体化视图用于联接和展平数据以优化其 BI Engine 结构时,这一做法尤其有效。

BI Engine 具有以下优势:

  • BigQuery API 兼容性:BI Engine 直接与 BigQuery API 集成。通过 RESTJDBC 和 ODBC 驱动程序等标准机制使用 BigQuery API 的任何 BI 解决方案或自定义应用都可以使用 BI Engine,而无需进行更改。
  • 矢量化运行时:在执行引擎中使用矢量化处理,可以一次性批量处理数据,从而更高效地使用现代 CPU 架构。BI Engine 还使用高级数据编码(具体来说是字典运行时长编码)来进一步压缩存储在内存层中的数据。
  • 无缝集成:BI Engine 可与 BigQuery 功能和元数据搭配使用,包括已获授权的视图、列级安全性以及数据遮盖。
  • 预留分配:BI Engine 预留会单独管理每个项目和区域的内存分配。BI Engine 仅缓存列和分区中被查询的所需部分。您可以使用首选表指定哪些表使用 BI Engine 加速功能。

在大多数组织中,BI Engine 由结算管理员启用,该管理员必须为 BI Engine 加速功能预留容量。如需了解详情,请参阅预留 BI Engine 容量

BI Engine 使用场景

BI Engine 可以显著加快许多 SQL 查询的速度,包括用于 BI 信息中心的查询。如果您确定对查询至关重要的表,然后将它们标记为首选表,则加速是最有效的。如需使用 BI Engine,您需要在某个区域中创建预留并指定其大小。您可以让 BigQuery 根据项目的使用模式确定要缓存的表,也可以指定表以防止其他流量干扰加速。

BI Engine 在以下使用场景中非常有用:

  • 使用 BI 工具分析数据:无论 BigQuery 查询是在 BigQuery 控制台、BI 工具(例如 Looker Studio 或 Tableau)、客户端库、API 或 ODBC 或 JDBC 连接器中运行,BI Engine 都能加速其运行速度。这可以显著提高通过内置连接 (API) 或连接器连接到 BigQuery 的信息中心的性能。
  • 您有经常查询的表:BI Engine 使您可以指定首选表以加快查询速度。如果您有一部分表被查询的频率最高或用于高可见性信息中心,这一做法将非常有用。

在以下情况下,BI Engine 可能不符合您的需求:

  • 在查询中使用通配符:BI Engine 不支持引用通配符表的查询,这些查询无法获得加速。
  • 您需要 BI Engine 不支持的 BigQuery 功能:虽然 BI Engine 支持大多数 SQL 函数和运算符,但BI Engine 不支持的功能包括外部表、行级安全性和非 SQL 用户定义的函数。

BI Engine 的注意事项

在决定如何配置 BI Engine 时,请考虑以下事项:

确保加快特定查询的速度

如需确保一组查询获得加速,请创建包含专用 BI Engine 预留的单独项目。首先,估算查询所需的计算容量,然后将这些表指定为 BI Engine 的首选表

尽量减少联接

当用于预联接或预汇总数据,以及少量联接中的数据时,BI Engine 的效果最好。当联接的一侧较大而另一侧小得多(例如,当您查询与较小的维度表联接的大型事实表)时,尤其如此。您可以将 BI Engine 与具体化视图结合使用,这些视图会执行联接以生成单个大型展平表。这样,系统就不会针对每个查询执行相同的联接。建议使用过时物化视图,以实现最佳查询性能。

了解 BI Engine 的效果

如需了解 BI Engine 的使用情况,请参阅使用 Cloud Monitoring 监控 BI Engine,或查询 INFORMATION_SCHEMA.BI_CAPACITIESINFORMATION_SCHEMA.BI_CAPACITY_CHANGES 视图。请务必停用 BigQuery 中的使用缓存的结果选项,以获得最准确的比较结果。如需了解详情,请参阅使用缓存的查询结果

首选表

借助 BI Engine 首选表,您可以将 BI Engine 加速限制为一组指定的表。对所有其他表的查询使用常规 BigQuery 槽。例如,借助首选表,您可以仅加速被确定为对您的业务重要的表和信息中心。

如果项目中没有足够的 RAM 来保存所有首选表,则 BI Engine 会分流最近未访问的分区和列。此过程会为需要加速的新查询释放内存。

首选表限制

BI Engine 首选表存在以下限制:

  • 您无法将视图添加到首选表预留列表中。BI Engine 首选表仅支持表。
  • 仅当具体化视图及其基表都位于首选表列表中时,才会加速对具体化视图的查询。
  • 不支持指定分区或列进行加速
  • JSON 类型列不受支持,BI Engine 不会加速这些列。
  • 仅当所有表都是首选表时,访问多个表的查询才会加速。例如,具有 JOIN 的查询中的所有表都必须处于要加速的首选表列表中。只要有一个表不在首选表列表中,查询就无法使用 BI Engine。
  • Google Cloud 控制台不支持公共数据集。如需将公共表添加为首选表,请使用 API 或 DDL。

限制

BigQuery BI Engine 存在以下限制。

联接

BI Engine 可加速某些类型的联接查询。加速会在使用 INNERLEFT OUTER JOINS 的叶级子查询中发生,其中一个大型事实表最多与四个较小的“维度”表联接。小维度表存在以下限制:

  • 行数少于 500 万
  • 大小限制:
    • 未分区表:不超过 5 GB
    • 分区表:被引用的分区不超过 1 GB

窗口函数

窗口函数(也称为分析函数)通过 BigQuery BI Engine 加速时存在以下限制:

  • 如果输入阶段不包含窗口函数,BigQuery BI Engine 会加速这些阶段。在这种情况下,INFORMATION_SCHEMA.JOBS 视图会将 bi_engine_statistics.acceleration_mode 报告为 FULL_INPUT
  • BI Engine 会加速输入阶段中包含窗口函数的查询的输入阶段,但这些阶段不存在“BI Engine 窗口函数限制”中所述的限制。在这种情况下,输入阶段或完整查询会在 BI Engine 中执行。在这种情况下,INFORMATION_SCHEMA.JOBS 视图会将 bi_engine_statistics.acceleration_mode 报告为 FULL_INPUTFULL_QUERY

如需详细了解 BiEngineStatistics 字段,请参阅作业参考

BI Engine 窗口函数限制

只有满足以下所有条件时,BI Engine 中才会运行包含窗口函数的查询:

  • 查询仅扫描一个表。
    • 该表未进行分区。
    • 表中的行数少于 500 万。
  • 该查询不包含 JOIN 运算符。
  • 所扫描表的大小乘以窗口函数运算符的个数所得的结果不超过 300 MiB。

具有相同 OVER 子句和相同直接输入的两个窗口函数可以共用同一窗口函数运算符。例如:

  • SELECT ROW_NUMBER() OVER (ORDER BY x), SUM(x) OVER (ORDER BY x) FROM my_table 只有一个窗口函数运算符。
  • SELECT ROW_NUMBER() OVER (ORDER BY x), SUM(x) OVER (PARTITION BY y ORDER BY x) FROM my_table 有两个窗口函数运算符,因为这两个函数具有不同的 OVER 子句。
  • SELECT ROW_NUMBER() OVER (ORDER BY x) FROM (SELECT SUM(x) OVER (ORDER BY x) AS x FROM my_table) 有两个窗口函数运算符,因为这两个函数具有不同的直接输入,即使它们的 OVER 子句看起来相同。

支持的窗口函数

支持以下引用的窗口函数:

  • ANY_VALUE
  • AVG
  • BIT_AND
  • BIT_OR
  • BIT_XOR
  • CORR
  • COUNT
  • COUNTIF
  • COVAR_POP
  • COVAR_SAMP
  • CUME_DIST
  • DENSE_RANK
  • FIRST_VALUE
  • LAG
  • LAST_VALUE
  • LEAD
  • LOGICAL_AND
  • LOGICAL_OR
  • MAX
  • MIN
  • NTH_VALUE
  • NTILE
  • PERCENT_RANK
  • PERCENTILE_CONT
  • PERCENTILE_DISC
  • RANK
  • ROW_NUMBER
  • ST_CLUSTERDBSCAN
  • STDDEV_POP
  • STDDEV_SAMP
  • STDDEV
  • STRING_AGG
  • SUM
  • VAR_POP
  • VAR_SAMP
  • VARIANCE

如果不支持窗口函数,您可能会看到以下错误:

分析函数与其他运算符不兼容或其输入过大

其他 BI Engine 限制

以下功能不具有 BI Engine 加速的特点:

  • JavaScript UDF
  • 外部表
  • 查询 JSON 数据 - 错误消息:不支持 JSON 原生类型
  • 将结果写入永久 BigQuery 表
  • 包含使用 BigQuery 变更数据捕获的更新/插入操作的表
  • 事务
  • 返回 1 GiB 以上的数据的查询。对于对延迟敏感的应用,建议的响应大小小于 1 MiB。
  • 行级安全性

针对不支持的功能的解决方法

虽然 BigQuery BI Engine 不支持某些 SQL 功能,但是有一种解决方法:

  1. 在 BigQuery 中编写查询。
  2. 将查询结果保存到表中。
  3. 安排您的查询以定期更新表。每小时或每天刷新率最有效。每分钟刷新一次可能会导致缓存过于频繁地失效。
  4. 在性能关键查询中引用此表格。

配额和限制

如需了解适用于 BI Engine 的配额和限制,请参阅 BigQuery 配额和限制

价格

您为 BI Engine 容量创建的预留会产生费用。如需了解 BI Engine 价格,请参阅 BigQuery 价格页面。

后续步骤