クエリはプログラムのようには実行されません。これらは、ステップ1、次にステップ2を実行する手順ではありません。代わりに、必要な結果についての宣言型ステートメントです。最新のRDBMSのほとんどでは、任意のクエリをさまざまなクエリプランで実行できます。通常、さまざまなクエリプランが作成され、どのプランが最も速く実行されるかが評価されます。クエリプランのセットを作成する際に、最初に評価する必要がある条件、条件を評価する前または後に結合を実行する必要があるかどうかなどを考慮して、どちらが断食されるかを判断しようとします(テーブルのサイズと、特定の条件に含まれるテーブルの割合についての推測)。それらの多くはまた、以前の結果を見て、近似が間違っている場合の将来の決定を通知します。
ほとんどの場合、最新のRDBMSでは、これら2つのクエリが同じクエリプランのセットを生成するため、同じ選択が行われ、両方のクエリに対して同じクエリプランが実行されます。使用しているRDBMSに応じて、通常、特定のクエリに対して選択されている特定のクエリプランを確認するために使用できるツールがあるため、これを使用して、特定のデータベース上の2つの特定のクエリの質問に完全に答えることができます。
さて、これは「同じデータに対して常に同じ回答を生成する2つのクエリは、常に同じ時間かかる」と言うことと同じではないことに注意してください。主に不必要な複雑さによって、本当に悪いクエリを書くことは可能であり、クエリプランナーがあなたがそれをやり過ぎたことに気付くという保証はありません。おそらく単純なケースをキャッチします。したがって、たとえば:
SELECT * FROM student_tbl A, result_tbl B WHERE
A.student_name = B.student_name AND
A.student_name = 'xyz' AND
B.student_name = A.student_name
また、おそらく同じクエリプランを生成します。そして、これは次のことも行う可能性があります。
SELECT * FROM student_tbl A, result_tbl B WHERE
A.student_name = B.student_name AND
A.student_name = 'xyz' AND
B.student_name = 'xyz'
しかし、あなたが本当に複雑なことをするなら
(SELECT * FROM student_tbl A, result_tbl B WHERE
A.student_name = B.student_name AND
A.student_name = 'xyz')
UNION
(SELECT * FROM student_tbl A, result_tbl B WHERE
A.student_name = B.student_name AND
B.student_name = 'xyz')
INTERSECT
(SELECT * FROM student_tbl A, result_tbl B WHERE
A.student_name = 'xyz')
より複雑なクエリプランを実行する場合があります。(ただし、その完全に不必要に複雑なクエリは、他の2つと同じ結果を生成します(NULLがないと仮定))。
したがって、オプティマイザは全知ではありませんが、XANDYはYANDXと同じものであり、A = B AND B=CはA=CおよびA=Bと同じものであると認識し、それに応じて調整する傾向があります。それらの場合のために。彼らは実際にさまざまな変換を行って最良のクエリを見つけようとし、一般的にそれを見つけるのに非常に優れています。クエリプランナーの決定を上書きすることは可能ですが、それは、クエリを実行するためのより良い方法があり、データの変更によってそれが変更される可能性が低いことが確実な場合にのみ実行する必要があります。