2011-12-07 5 views
2

1)これら2つのクエリの間にパフォーマンスの違いはありますか?

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 ; 

私は、これらのクエリの結果が同じであることを知っています。 パフォーマンスにどのような違いがありますか?もしそうなら、理由を説明してください。

+1

相違点(実装されている場合があります)が実装固有のものである可能性があります。私にとっては、これは「マイクロ最適化」のカテゴリに該当します。テストケースを設定し、それが非常に重要な場合には何らかの測定を行うのはなぜですか? – spender

+1

@spender私の推測*これは宿題です。間違っている可能性があります。私はちょうどもう間違っていることになっています...それは数秒です! ;) –

+0

@andrew barber私はちょうど私の質問で簡単な例を与えた。実際には、大量のデータを持つ2つのテーブルです。 – user1085296

答えて

2

これらは同じです。 where句の条件は、A.student_nameとB.student_nameの両方が "xyz"であることを意味します。クエリオプティマイザは両方に対して同じ実行計画を生成しますが、実行計画(MS SQL Serverを使用する場合はSQL Server Management Studioなど)を調べることでこれを確認できます。

+0

彼らは同じですか?述語の評価の順序がすべての行で同じであると仮定します。ここで、多数の候補が1つの述語を満たしているが、第2の述語を満たしていないと仮定する。また、クエリを実行しているエンキンがショートカット評価を使用するとします。彼らはまだ同じですか?おそらく、ほぼ確実でしょうか? – spender

+0

@spender私は、良いクエリオプティマイザが何をするか想像するのは簡単です:student_nameが "xyz"のAとBからのタプルを結合します。少なくとも、結果セットを生成する最適な方法は想像できません。実際の実装は使用するDBMSによって異なります。そのため、私は実行計画を比較することを提案しました。 – kol

+2

@downvoter downvoteを教えてください。私に教えてください。 – kol

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') 
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 =これらの場合に応じて調整してください。彼らは実際には最良のクエリを見つけるためにさまざまな変換を行い、一般的にそれを見つけるのにはかなり良いです。クエリプランナの決定を無効にすることは可能ですが、クエリを実行するためのより良い方法があることが確かで、データの変更がそれを変更する可能性が低い場合にのみ行う必要があります。

2

SQL Serverを使用している場合、それぞれの実行計画を表示し、実際に何が起きているかを見ることができます。これにより、各操作のコストとクエリが実際に各テーブルに対して行うことが分かります。

奥行きの深い外観では、クエリを実行して実行時間を確認するだけでも可能です。

ここで本当に疑問に思うのは、where句の条件の順番がパフォーマンスに影響しますか?この場合は、この記事をお読みになりたいかもしれません。Does the order of columns in a WHERE clause matter?

関連する問題