优化查询计算

评估查询所需的计算时,请考虑所需的工作量。需要多少 CPU 时间?您使用的函数是否像 JavaScript 用户定义函数那样需要额外的 CPU 资源?

以下最佳做法提供控制查询计算的指南。

通过 SQL 查询避免重复转换数据

最佳做法:如果您使用 SQL 执行 ETL 操作,请避免重复转换相同数据的情况。

例如,如果您在使用 SQL 通过正则表达式修剪字符串或提取数据,那么在目标表中将转换的结果实体化将会改善性能。诸如正则表达式之类的函数需要额外的计算。在不增加转换开销的情况下查询目标表会更有效率。

避免 JavaScript 用户定义函数

最佳做法:避免使用 JavaScript 用户定义函数。请改为使用原生 UDF。

如果调用 JavaScript UDF,需要实例化子进程。直接启动此进程并运行 UDF 会影响查询性能。如果可行,请改为使用原生 (SQL) UDF

使用近似聚合函数

最佳做法:如果您的用例支持的话,请使用近似聚合函数。

如果您使用的 SQL 聚合函数具有等效的近似函数,则该近似函数将会实现更快的查询性能。例如,请使用 APPROX_COUNT_DISTINCT(),而不要使用 COUNT(DISTINCT)。如需了解详情,请参阅标准 SQL 参考中的近似聚合函数

您还可以使用 HyperLogLog++ 函数来计算近似值(包括自定义近似聚合)。如需了解详情,请参阅标准 SQL 参考中的 HyperLogLog 函数

对查询操作排序以最大限度地改善性能

最佳做法:仅在最外层查询或窗口子句(分析函数)内使用 ORDER BY。将复杂的操作推到查询的末尾处。

如果您需要对数据进行排序,请先进行过滤,以减少需要排序的值的数量。如果您先对数据进行排序,则排序的数据会比所需的多得多。最好是对数据的子集进行排序,而不是排序所有数据然后应用 LIMIT 子句。

使用 ORDER BY 子句时,它应当仅出现在查询的最外层。在查询的中间放入 ORDER BY 子句会极大地影响性能,除非是在窗口(分析)函数中使用该子句。

对查询进行排序的另一个方法是将复杂的操作(如正则表达式和数学函数)推到查询的末尾处。同样,这种方法可在执行复杂操作之前尽可能地删减数据。

优化联接模式

最佳做法:对于连接多个表中的数据的查询,请优化连接模式。从最大的表开始。

当您使用 JOIN 创建查询时,请考虑合并数据的顺序。标准 SQL 查询优化器可以决定哪个表应位于联接的哪一侧,但仍建议您适当地对联接的表进行排序。最佳做法是先放置最大的表,然后放置最小的表,接下来再按从大到小的顺序放置。

将大型表放在 JOIN 的左侧并将小型表放在 JOIN 的右边后,将创建一个广播联接。广播联接将较小表中的所有数据发送到处理较大表的每个槽。建议先执行广播联接。

要查看 JOIN 中表的大小,请参阅获取有关表的信息

删减分区查询

最佳做法:查询分区表时,请使用 _PARTITIONTIME 伪列来过滤分区。

在查询分区表时,请使用 _PARTITIONTIME 伪列。通过使用 _PARTITIONTIME 过滤数据,您可以指定日期或日期范围。例如,以下 WHERE 子句使用 _PARTITIONTIME 伪列指定 2016 年 1 月 1 日和 2016 年 1 月 31 日之间的分区:

WHERE _PARTITIONTIME
BETWEEN TIMESTAMP("20160101")
    AND TIMESTAMP("20160131")

该查询仅处理日期范围所指示的分区中的数据。过滤分区可提升查询性能并降低费用。

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
需要帮助?请访问我们的支持页面