2

1)

select * from student_tbl A ,result_tbl B where
A.student_name = B.student_name and
A.student_name = "xyz" ;

2)

select * from student_tbl A ,result_tbl B where
A.student_name = "xyz" and
A.student_name = B.student_name ;

これらのクエリの結果が同じであることはわかっています。性能差はありますか?もしそうなら、その理由を説明してください。

4

3 に答える 3

6

クエリはプログラムのようには実行されません。これらは、ステップ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と同じものであると認識し、それに応じて調整する傾向があります。それらの場合のために。彼らは実際にさまざまな変換を行って最良のクエリを見つけようとし、一般的にそれを見つけるのに非常に優れています。クエリプランナーの決定を上書きすることは可能ですが、それは、クエリを実行するためのより良い方法があり、データの変更によってそれが変更される可能性が低いことが確実な場合にのみ実行する必要があります。

于 2011-12-07T10:03:34.490 に答える
2

SQLサーバーを使用していると仮定すると、それぞれの実行プランを表示して実際に何が起こっているかを確認できます。これにより、各操作のコストと、クエリが各テーブルに対して実際に行うことを確認できます。

あまり詳しくない場合は、クエリを実行して実行時間を確認することもできます。

ここでの本当の質問は、「where句の条件の順序はパフォーマンスに影響しますか?」だと思います。この場合、このSOの投稿を読むことをお勧めします。WHERE句の列の順序は重要ですか?

于 2011-12-07T10:10:59.493 に答える
2

これらは同じです。where 句の条件は、A.student_name と B.student_name の両方が「xyz」であることを意味します。クエリ オプティマイザーが両方に対して同じ実行プランを生成する可能性は高くなりますが、これは実行プランを調べることで確認できます (たとえば、MS SQL Server を使用している場合は SQL Server Management Studio で)。

于 2011-12-07T09:35:10.820 に答える