8

次のクエリに取り組んでいます。

Query 1: SELECT * From TabA INNER JOIN TabB on TabA.Id=TabB.Id
Query 2: SELECT * From TabA WHERE Id in (SELECT Id FROM TabB)
Query 3: SELECT TabA.* From TabA INNER JOIN TabB on TabA.Id=TabB.Id

これらのクエリを SQL Server プロファイラーで調査したところ、興味深い事実がいくつか見つかりました。

  • クエリ 1 には 2.312 秒かかります
  • クエリ 2 には 0.811 秒かかります
  • クエリ 3 には 0.944 秒かかります

TabA 48716 行

TabB 62719 行

基本的に私が求めているのは、クエリ 3 ではなくクエリ 1 に時間がかかる理由です。「サブクエリ」が内部結合よりも遅いことは既にわかっていますが、ここではクエリ 2 が最速です。なぜ?

4

4 に答える 4

2

クエリ 1:
このクエリは、TabA と TabB の両方のすべての行から行を返すため、両方のテーブルのカバー インデックスには、各テーブルのすべての行を含める必要があります。何が起こっているのかを正確に確認するには、クエリ プランを確認します。

クエリ 2 & クエリ 3:
TabA からすべての行を返し、TabB の Id 列のインデックスのみが必要です。ここでの違いはテーブルの統計に関係していると思いますが、(もう一度)何が起こっているのかを正確に知るには、クエリ プランを確認する必要があります。

于 2013-05-02T14:43:21.390 に答える
1

これは単純に、SQL が JOIN を実行する必要がないためです。2 つのクエリを実行しているだけで、そのうちの 1 つだけに WHERE 句があります。

こんなに大きな違いがあるとは思っていなかったことを認めなければなりません。

于 2013-05-02T14:04:44.857 に答える