2017-06-16 5 views
1

同じことを行う2つのSQL問合せがあり、最初の問合せでは13秒、実行には1秒かかります。理由は何ですか? ProcessMessagesでSQL結合の実行が遅い

ない必要なすべてのIDはProcessMessageDetails

内のデータを持っています -

Select * from dbo.ProcessMessageDetails 
    where ProcessMessageId in (Select distinct ProcessMessageId from dbo.ProcessMessages t1 
    Where Where Id = 4 and Isdone = 0) 

Iを実行するために秒の下

Select * from dbo.ProcessMessages t1 
    join dbo.ProcessMessageDetails t2 on t1.ProcessMessageId = t2.ProcessMessageId 
    Where Id = 4 and Isdone = 0 

--takesを実行するために13秒かかりますt1.processMessageId(Pk)にclusterdインデックス、t2.processMessageId(FK)にnon clusterdインデックスを持つ

+0

idとisdoneソースはどのテーブルからですか? Additinoally 1番目のものでは1-M joinが解決されていますが、2番目のエンジンではテーブルに参加する必要はありません。 – xQbert

+0

IdとIsdoneはdbo.ProcessMessages t1から供給されています。 IdとIsDone用に非クラスタ化インデックスを作成しました – user1005310

+1

実行計画を追加できますか? – Naruto

答えて

1

SqlServerが何をしているのかを正確に伝えるために、実際の実行計画が必要です。これらのクエリがまったく同じことをしていないと私はあなたに伝えることができます。

最初のクエリは、t1の条件を満たすすべてのアイテムを検索し、t2のすべてのアイテムを検索し、一致するものを見つけてそれらを一緒に結合します。

第2のものは、最初にt1から自分の基準を満たしているアイテムをすべて見つけ出し、次にこれらのIDの1つを持つt2のアイテムを見つけます。

利用可能なインデックス、ハードウェア、テーブルサイズに応じて、Sql Serverは異なる種類のスキャンを実行するか、クエリの各部分についてデータを選択することを決定します。特定の方法。