2009-03-09 15 views
2

別のテーブルの対応する行を持つ1つのテーブルのすべての行を選択するとします(他のテーブルのデータは重要ではなく、対応する行が存在するは重要)。私がDB2について知っていることから、INNER JOINではなくEXISTS句を使って相関クエリとして記述すると、このようなクエリが優れたパフォーマンスを発揮します。これはSQL Serverでも同じですか?それとも何か違いはありませんか?SQL Serverの相関クエリと内部結合のパフォーマンス

答えて

2

私はテストクエリを実行しましたが、2つのステートメントはまったく同じ実行プランで終了しました。もちろん、パフォーマンスに関する質問については、自分の環境でテストを実行することをお勧めします。 SQL Server Management Studioの場合、これは簡単です(実行中の2000の場合はSQLクエリアナライザ)。両方のステートメントをクエリウィンドウに入力するだけで、クエリ|実際のクエリプランを含めるを選択します。次に、クエリを実行します。 [結果]タブに移動すると、計画の内容とコストの高さを簡単に確認できます。

+0

さて、テストするのに適切な大きさのDBがある場合にのみ実行できますが、私はあなたの返事を当然受け取りません。 –

1

奇数:私は通常、相関クエリとしてこれらを記述するのが自然です。まず、SQL ServerオプティマイザがSQL Serverの最適化ツールを使用する可能性が高いため、戻ってジョインを使用する必要があります。それを得る。

しかし、私をあまり真剣に受け入れないでください。私はここで26Kの担当者と2つの現在のSQLトピック特有のバッジのうちの1つしか持っていませんが、私は実際にはSQLの知識の面でかなり後輩です(それはボリュームに関するすべてです!確かに私はDBAではありません。実際には、もちろん、実際のパフォーマンスを測定するために各メソッドをプロファイリングする必要があります。 オプティマイザがあなたに求めているものを認識し、いずれかのクエリを最適な方法で処理することを期待していますが、チェックするまではわかりません。

+0

これは私にとっては自然に書ける方法ですが、これは主に私のDB2の偏差によるものです)。実際には、これはDB2の最適化された外観に欠陥がありますが、これも同様に認識できるはずです。 –

+0

私は同意します。私は通常、オプティマイザが相関サブクエリよりも時間の割合が高いジョインを正しく取得することを発見しました。しかし、あなたが言うように、走行距離は変わるかもしれません。 – mwigdahl

0

誰もが注意するように、それはすべてオプティマイザにまでわかります。より自然な感じで書くことをお勧めします。その後、オプティマイザが最も効果的なクエリプランを見つけ出すことができます(統計の収集、インデックスの作成など)。 SQL Serverオプティマイザは、作業に必要な情報を提供している限り、全体的に見ても非常に優れています。

0

おそらく、最高のパフォーマンスは、派生テーブルへの結合によるものです。 Existsはおそらく次のものです(より速いかもしれません)。最悪のパフォーマンスは、セレクト内のサブクエリにあり、セットではなく行ごとに実行される傾向があります。

しかし、すべてが等しく、データベースのパフォーマンスはデータベース設計に大きく依存しています。私はすべての可能な方法を試してみて、どちらがあなたの状況においてより速いかを見ていきます。

1

結合を使用します。小さなテーブルがある場合はパフォーマンスの違いはほとんどありませんが、「外側」テーブルが非常に大きい場合は、各行に対してEXISTSサブクエリを実行する必要があります。テーブルが共通の列にインデックスされている場合は、INNER JOINを実行する方がはるかに迅速になるはずです。ところで、2番目のテーブルにないすべての行を検索する場合は、LEFT JOINを使用し、2番目のテーブルでNULLをテストします。非常に大きなテーブルとインデックスを持つときにEXISTSを使用するよりもはるかに高速です。

関連する問題