効率的な SQL 構文

WHERE 句内のサブクエリではなく、(FROM 句で)JOIN を使用して、クエリにテーブルを含めます。結果セットではなくフィルター処理のためにのみテーブルのデータが必要な場合でも、このヒントは適用されます。

FROM 句で複数のテーブルを結合すると、WHERE 句でサブクエリを使用するよりもパフォーマンスが向上します。

インデックスを利用できない SQL ステートメントは避けます。これには、サブクエリで集計関数を使用するステートメント、サブクエリの UNION ステートメント、また、UNION ステートメントを使用した ORDER BY 句などが該当します。

インデックスによって SELECT クエリの処理速度は大幅に向上する可能性があります。ただし、一部の SQL 構文では、データベースにインデックスを使用できず、検索操作またはソート操作に実際のデータを使用する必要があります。

LIKE 演算子の使用は避けます。特に、LIKE('%XXXX%') のように先頭をワイルドカード文字にすることは避けてください。

LIKE 演算はワイルドカード検索の使用をサポートしているので、完全一致の比較を使用する演算子に比べると低速です。特に、検索ストリングの先頭をワイルドカード文字で開始すると、検索時にインデックスを使用できません。その場合、データベースは、テーブルの各行を全文検索する必要があります。

IN 演算子の使用を避けます。有効な値を事前に把握している場合は、IN 演算を AND または OR を使用して作成すると、実行が速くなります。

次の 2 つのステートメントでは、2 番目のステートメントのほうが高速に実行されます。高速な理由は、IN() または NOT IN() ステートメントを使用するのではなく、単純な等価式と OR を組み合わせて使用しているからです。

-- Slower 
SELECT lastName, firstName, salary 
FROM main.employees 
WHERE salary IN (2000, 2500) 
     
-- Faster 
SELECT lastName, firstName, salary 
FROM main.employees 
WHERE salary = 2000 
    OR salary = 2500
パフォーマンスを改善する代替形式の SQL ステートメントを検討します。

前の例で示したように、SQL ステートメントの記述方法もデータベースのパフォーマンスに影響を与えます。多くの場合、SQL SELECT ステートメントを記述して特定の結果セットを取得するには複数の方法があります。場合によっては、ある方法が別の方法よりも大幅に実行が高速になることもあります。上記の説明だけでなく、SQL 言語専用のリソースから、様々な SQL ステートメントとパフォーマンスについて詳しく学習できます。