クエリはプログラムと同様に実行されません。それらは手順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')
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')
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'
しかし、あなたが本当に複雑な何かをする場合のような
:そしてこれもそうです。 (ただし、完全に不必要に複雑なクエリは、他の2つのクエリと同じ結果を生成します(NULLがないと仮定します))。
オプティマイザは全然ではありませんが、XとYはY AND Xと同じものであり、A = BとB = CはA = CとA =これらの場合に応じて調整してください。彼らは実際には最良のクエリを見つけるためにさまざまな変換を行い、一般的にそれを見つけるのにはかなり良いです。クエリプランナの決定を無効にすることは可能ですが、クエリを実行するためのより良い方法があることが確かで、データの変更がそれを変更する可能性が低い場合にのみ行う必要があります。
相違点(実装されている場合があります)が実装固有のものである可能性があります。私にとっては、これは「マイクロ最適化」のカテゴリに該当します。テストケースを設定し、それが非常に重要な場合には何らかの測定を行うのはなぜですか? – spender
@spender私の推測*これは宿題です。間違っている可能性があります。私はちょうどもう間違っていることになっています...それは数秒です! ;) –
@andrew barber私はちょうど私の質問で簡単な例を与えた。実際には、大量のデータを持つ2つのテーブルです。 – user1085296