

# クエリを最適化する
<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 がすべてのデータ行を 1 つのワーカーノードに送信し、行をソートする必要があります。このタイプのクエリは、長時間実行される場合もあれば、失敗する場合もあります。

クエリの効率を上げるには、上位または下位の {{N}} 個の値を確認してから、`LIMIT` 句も使用してください。これにより、ソートと制限の両方を単一のワーカーノードではなく個々のワーカーノードにプッシュすることで、ソートのコストが大幅に削減されます。

## JOIN 句の最適化
<a name="performance-tuning-s3-throttling-optimize-join-clauses"></a>

2 つのテーブルを結合すると、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` 句は、クエリに対して複数の結合や集計を実行するときにも役立ちます。