

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 最佳化您的查詢
<a name="performance-tuning-s3-throttling-optimizing-queries"></a>

使用本節中的建議優化 Athena 中的 SQL 查詢。

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

`ORDER BY` 子句會以排序順序傳回資料。這需要 Athena 將所有資料列傳送至單一工作節點，然後排序資料列。這種查詢類型可以執行很長一段時間，甚至失敗。

為了提高查詢的效率，請查看頂部或底部的 {{N}} 個值，然後使用 `LIMIT` 子句。這樣可以將排序和限制推送至個別工作節點，而不是單一工作節點，進而大幅降低排序的成本。

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

當您聯結兩個資料表時，Athena 會將右側的資料表分散至工作節點，然後串流左側的資料表以執行聯結。

因此，請在聯結左側指定較大的資料表，並在聯結的右側指定較小的資料表。如此一來，Athena 會使用較少的記憶體，並以較低的延遲執行查詢。

另外，請注意以下重點：
+ 當您使用多個 `JOIN` 命令時，請按從最大到最小的順序指定資料表。
+ 除非查詢需要交叉聯結，否則請予以避免。

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

`GROUP BY` 運算子會根據 `GROUP BY` 資料欄將資料列分散至工作節點。我們會在記憶體中引用這些資料欄，並在擷取資料列時比較這些值。當 `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\_like()](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` 子句也很有用。