优化查询性能简介

有时,查询运行的速度比您希望的要慢。一般而言,查询执行的工作量较少时,查询性能会较为出众。这些查询的运行速度更快,消耗的资源更少,从而可以降低费用并减少故障。本文档简要介绍了一些可以提高 BigQuery 查询性能的优化方法。

查询性能

在 BigQuery 中评估查询性能时,请考虑以下几个因素:

如需评估特定查询是否存在问题或者是否发生资源争用,您可以使用 Cloud MonitoringBigQuery 管理资源图表来监控一段时间内 BigQuery 作业使用资源的情况。如果发现速度缓慢或占用大量资源的查询,则可以将性能优化的重心放在该查询上。

某些查询模式(尤其是商业智能工具生成的查询模式)可以使用 BigQuery BI Engine 加速。BI Engine 是一项高速内存中分析服务,它可以智能地缓存最常使用的数据,从而加快 BigQuery 中的许多 SQL 查询的速度。BI Engine 内置于 BigQuery 中,这意味着您通常无需进行任何查询修改即可获得更好的性能。

与任何系统一样,优化性能有时需要权衡利弊。 例如,使用高级 SQL 语法有时会增加复杂性并降低查询对非 SQL 专家的可理解性。 花时间对非关键工作负载进行微优化还可能分散资源,无法将其用于为应用构建新功能,或者进行更有影响的其他优化。因此,为了帮助您获得尽可能高的投资回报率,我们建议您将优化重心放在对数据分析流水线最重要的工作负载上。

容量和并发

对于查询,BigQuery 提供两种价格模式:按需价格和基于容量的价格。按需模式提供共享容量池,价格基于您运行的每个查询处理的数据量。

如果您想保持一致的每月支出,或者需要的容量比按需模式多,则建议使用基于容量的模式。使用基于容量的价格时,您可以分配以为单位的专用查询处理容量。处理的所有字节的费用都包含在基于容量的价格中。除了固定的槽承诺之外,您还可以使用自动扩缩槽,它会根据您的查询工作负载提供动态容量。

在 SQL 查询处理期间,BigQuery 会将执行查询的每个阶段所需的计算容量划分为多个槽。BigQuery 会按如下所示自动确定可并发运行的查询数量:

  • 按需模式:项目中可用的槽数
  • 基于容量的模式:预留中可用的槽数

需要的槽数超过可用槽数的查询会排队,直到有处理资源可用。查询开始执行后,BigQuery 会根据查询阶段大小和复杂性以及可用的槽数计算每个查询阶段使用的槽数。BigQuery 使用一种称为公平调度的机制来确保每个查询都有足够的容量来继续执行。

可使用更多的槽并不总是导致查询的速度更快。但更大的槽池可以提高大规模或复杂查询的性能,还可以提升高并发工作负载的性能。如需提高查询性能,您可以修改槽预留或为槽自动扩缩设置更高的限制。

查询计划和时间轴

每次您运行查询时,BigQuery 都会生成一个查询计划。了解此计划可帮助您有效地优化查询。查询计划包含读取的字节数和使用的槽时间等统计信息。查询计划还包含有关执行的不同阶段的详细信息,可帮助您诊断问题和提高查询性能。查询执行图提供了一个图形界面,用于查看查询计划和诊断查询性能问题。

您还可以使用 jobs.get API 方法INFORMATION_SCHEMA.JOBS 视图来检索查询计划和时间轴信息。此信息由 BigQuery Visualiser 使用,这是一款开源工具,可直观呈现 BigQuery 作业中的执行阶段流程。

BigQuery 在执行查询作业时,会将声明式 SQL 语句转换为执行图表。此图表会分解为一系列查询阶段,而这些阶段本身由更细化的多组执行步骤构成。BigQuery 使用高度分布式的并行架构来运行这些查询,而 BigQuery 阶段则模拟很多潜在工作器可能并行执行的工作单元。各阶段通过快速分布式重排架构相互通信。

查询执行计划。

除了查询计划之外,查询作业还会显示执行时间轴, 该时间轴用于提供查询工作器内处于已完成、待处理和活跃状态的工作单元的计量信息。 一个查询可能会同时经历多个具有活跃工作器的阶段,因此时间轴用于显示查询的整体进度。

时间轴统计信息。

如需估算查询的计算成本,您可以查看查询使用的总槽秒数。槽秒数越少越好,这意味着同一项目中同时运行的其他查询可以使用更多资源。

查询计划和时间轴统计信息可以帮助您了解 BigQuery 如何执行查询,以及某些阶段是否耗用太多资源。例如,生成的输出行远超输入行的 JOIN 阶段可能表示有必要在查询的早期阶段进行过滤。 不过,服务的托管特性限制了某些详细信息是否可直接操作。 如需了解改进查询执行和性能的最佳做法和方法,请参阅优化查询计算

后续步骤