

# 优化您的查询
<a name="performance-tuning-s3-throttling-optimizing-queries"></a>

使用本节中的建议优化 Athena SQL 查询。

## 在 ORDER BY 子句中使用 LIMIT
<a name="performance-tuning-s3-throttling-use-limit-with-the-order-by-clause"></a>

`ORDER BY` 子句按排序顺序返回数据。这要求 Athena 将所有数据行发送到单一 Worker 节点，然后对这些行进行排序。此类查询可能会运行很长时间，甚至会失败。

为了提高查询效率，查看前或后 *N* 个值，然后还要使用 `LIMIT` 子句。这将显著降低排序成本，因为会将排序和限制推送到各个 Worker 节点而不是单一 Worker。

## 优化 JOIN 子句
<a name="performance-tuning-s3-throttling-optimize-join-clauses"></a>

当您联接两个表时，Athena 会将右侧的表分配给 Worker 节点，然后流式处理左侧的表以执行联接。

因此，在联接的左侧指定较大的表，在联接的右侧指定较小的表。这样可减少 Athena 所用的内存并降低查询运行延迟。

同时注意以下几点：
+ 使用多个 `JOIN` 命令时，按从大到小顺序指定表。
+ 除非查询需要，否则避免使用交叉联接。

## 优化 GROUP BY 子句
<a name="performance-tuning-s3-throttling-optimize-group-by-clauses"></a>

`GROUP BY` 运算符根据 `GROUP BY` 列将行分配给 Worker 节点。这些列将在内存中引用，并在载入行时对值进行比较。当 `GROUP BY` 列匹配时，这些值会聚合在一起。考虑到此过程的工作方式，建议按基数从高到低对列进行排序。

## 使用数字代替字符串
<a name="performance-tuning-s3-throttling-use-numbers-instead-of-strings"></a>

由于与字符串相比，数字所需的内存更少且处理速度更快，因此尽可能使用数字代替字符串。

## 限制列数
<a name="performance-tuning-s3-throttling-limit-the-number-of-columns"></a>

要减少存储数据所需的总内存量，限制在 `SELECT` 语句中指定的列数。

## 使用正则表达式代替 LIKE
<a name="performance-tuning-s3-throttling-use-regular-expressions-instead-of-like"></a>

在大型字符串中包含 `LIKE '%string%'` 等子句的查询的计算量可能非常大。在字符串列中筛选多个值时，改用 [regexp\$1like()](https://trino.io/docs/current/functions/regexp.html#regexp_like) 函数和正则表达式。这在您比较一长串值时特别有用。

## 使用 LIMIT 子句
<a name="performance-tuning-s3-throttling-use-the-limit-clause"></a>

在运行查询时，使用 `LIMIT` 子句仅返回所需的列，而不是选择所有列。这减小了通过查询执行管道处理的数据集的大小。当查询包含大量基于字符串的列的表时，建议使用 `LIMIT` 子句。当您对任何查询执行多个联接或聚合时，也建议使用 `LIMIT` 子句。