2

この質問は MySQL に固有のものですが、この回答が一般的な SQL エンジンに当てはまるかどうかはわかりません。

また、これは構文クエリではないため、簡略化/明確化のために疑似 SQL を使用しています。

C[1]..C[M] が (AND または OR で区切られた) 基準のセットであり、Q[1]..Q[N] が別のセット (OR で区切られた) であるとします。C[1]...C[M] を使用してテーブルをフィルタリングし、このフィルタリングされたテーブルから、Q[1]...Q[N] に一致するすべての行が必要です。

私がするなら:

SELECT ... FROM  ... WHERE (C[1]...C[M]) AND (Q[1]...Q[N])

C[1]...C[M] が 1 回だけ検出され、各 Q[i] がこのキャッシュされた結果に対して実行されるように、これは自動的に最適化されますか? そうでない場合は、次のようにクエリを 2 つに分割する必要があります。

INSERT INTO TEMP ... SELECT ... FROM ... WHERE C[1]...C[N]
SELECT ... FROM TEMP WHERE Q[1]...Q[N]
4

1 に答える 1

0

これは、フィルターに従って結合をコンパイルするための最適な順序を計算する内部クエリ オプティマイザーの仕事です。

たとえば、次の場合:

SELECT * 
FROM
    table1 
        INNER JOIN table2 ON table1.id = table2.id AND table2.column = Y
        INNER JOIN table3 ON table3.id2 = table2.id2  AND table3.column = Z
WHERE
    table1.column = X

Mysql (/oracle/sqlserver など...) は、各中間結果セットを事前に計算して最高のパフォーマンスを提供しようとしますが、実際、ここでエンジンはかなり良い仕事をしています。

ただし、すべては、アーキテクチャで設定したテーブルとインデックスについて実際に持っている統計に依存しています。これらの 2 つのポイント (データでテーブルを埋めることは別として...) は、オプティマイザーが適切で正確な情報を提供することによって適切な決定を下すのを助けるために影響を与えることができる唯一のものです。

お役に立てば幸いです。

ps: これを見てください。これは、オラクルでのクエリのコンパイルにおける演算子と優先順位に関するものですが、とにかく知っておくとよいでしょう。

http://ezinearticles.com/?Oracle-SQL---優先順位の重要性&id=1597846

于 2012-11-09T18:23:30.353 に答える