优化您的查询
使用本节中的建议优化 Athena SQL 查询。
在 ORDER BY 子句中使用 LIMIT
ORDER BY
子句按排序顺序返回数据。这要求 Athena 将所有数据行发送到单一 Worker 节点,然后对这些行进行排序。此类查询可能会运行很长时间,甚至会失败。
为了提高查询效率,查看前或后 N
个值,然后还要使用 LIMIT
子句。这将显著降低排序成本,因为会将排序和限制推送到各个 Worker 节点而不是单一 Worker。
优化 JOIN 子句
当您联接两个表时,Athena 会将右侧的表分配给 Worker 节点,然后流式处理左侧的表以执行联接。
因此,在联接的左侧指定较大的表,在联接的右侧指定较小的表。这样可减少 Athena 所用的内存并降低查询运行延迟。
同时注意以下几点:
-
使用多个
JOIN
命令时,按从大到小顺序指定表。 -
除非查询需要,否则避免使用交叉联接。
优化 GROUP BY 子句
GROUP BY
运算符根据 GROUP
BY
列将行分配给 Worker 节点。这些列将在内存中引用,并在载入行时对值进行比较。当 GROUP BY
列匹配时,这些值会聚合在一起。考虑到此过程的工作方式,建议按基数从高到低对列进行排序。
使用数字代替字符串
由于与字符串相比,数字所需的内存更少且处理速度更快,因此尽可能使用数字代替字符串。
限制列数
要减少存储数据所需的总内存量,限制在 SELECT
语句中指定的列数。
使用正则表达式代替 LIKE
在大型字符串中包含 LIKE '%string%'
等子句的查询的计算量可能非常大。在字符串列中筛选多个值时,改用 regexp_like()
使用 LIMIT 子句
在运行查询时,使用 LIMIT
子句仅返回所需的列,而不是选择所有列。这减小了通过查询执行管道处理的数据集的大小。当查询包含大量基于字符串的列的表时,建议使用 LIMIT
子句。当您对任何查询执行多个联接或聚合时,也建议使用 LIMIT
子句。