0

私は次のように2つのSQLクエリを持っています

SELECT rc.stateId,rs.stateName FROM
(SELECT DISTINCT cityid FROM HolidayPackageCity) AS hpc
 INNER JOIN 
 (SELECT cityid,stateid FROM RegCity WHERE countryCode='IN' AND stateId IS NOT NULL) AS rc
ON hpc.cityId=rc.cityId
INNER JOIN
RegState AS rs
ON rc.stateId=rs.stateId

vs

SELECT DISTINCT rc.stateId,rs.stateName 
FROM HolidayPackageCity AS hpc
INNER JOIN 
  RegCity  AS rc
  ON hpc.cityId=rc.cityId
  INNER JOIN
    RegState AS rs
    ON rc.stateId=rs.stateId
WHERE rc.countryCode='IN' AND rc.stateId IS NOT NULL

最初のクエリでは、最初に特定のテーブルのデータをフィルタリングしてから結合を適用し、2番目のテーブルでは最初に結合を適用してからwhere条件を適用してデータをフィルタリングします。私が知りたいのは、どちらが速いのか、そしてその理由です。

4

3 に答える 3

1

オプティマイザは最初にwhere句でテーブルをフィルタリングし、次に結合に使用する内部一時テーブルを作成するため、2番目のクエリはより高速です。結論-より良い解決策は、より小さなデータセットを含むテーブルと結合することです。

ちなみに、オプティマイザはサブクエリを含まない2番目のクエリを簡単に処理します。

于 2012-11-30T07:49:11.987 に答える
0

一般的なルールは、特に結合が適切なインデックスを使用している場合、サブクエリは遅くなるということです。

于 2012-12-12T18:13:34.927 に答える
0

SQLServer2008で実行プランを表示できます。どこかにボタンがあります。両方のクエリを同じウィンドウに配置するだけで、それぞれに費やされた時間の割合がわかります。結果の正確さは、おそらく実際に1〜2ミリ秒以上かかるクエリに依存します。

2番目のクエリはオプティマイザーにはるかに多くの自由を与え、最初のクエリはそれをおそらく非効率的なパスに強制します(ただし、オプティマイザーが試行しないより効率的なパスに強制することもできます)。効率の違いはテーブルのレイアウトに依存すると確信していますが、このような単純なクエリでは、最適化されたクエリの効率が大幅に低下することはないと思います。

(私によれば)SQLの重要な点は、SQLに処理方法を指示せず、オプティマイザーに処理させるだけなので、2番目のクエリが優先されることに注意してください(オプティマイザーが常に適切に機能するとは限らないため、オプティマイザーに処理させ、ストレステストを実行して、処理が遅いかどうかを確認することをお勧めします。プロファイラーを使用して問題のあるクエリを特定し、より効率的なパスに強制します)。

于 2012-11-30T07:21:17.120 に答える