2017-06-16 144 views
1

我有2個SQL查詢做同樣的事情,第一個查詢需要13秒執行,而第二個需要1秒執行。任何理由?SQL連接運行緩慢

沒必要在所有的ProcessMessages ID將在ProcessMessageDetails

數據 - 需要13秒來執行秒下

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

--takes執行

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

我在t1.processMessageId(Pk)上具有羣集索引,在t2.processMessageId(FK)上具有非羣集索引

+0

從什麼表是ID和ISDONE來源?在第一個中,你有一個1-M連接被解析,而在第二個連接中,引擎不需要連接這些表。 – xQbert

+0

Id和Isdone來源於dbo.ProcessMessages t1。我爲Id和IsDone創建了非聚集索引 – user1005310

+1

您可以添加執行計劃嗎? – Naruto

回答

1

我需要實際的執行計劃來確切地告訴你SqlServer在幕後做了些什麼。我可以告訴你這些查詢並不完全一樣。

第一個查詢正在經過並找到滿足t1條件的所有項目,並找到t2的所有項目,然後查找哪些項目匹配並將它們連接在一起。

第二個說法是首先找到符合我的條件的所有項目,然後在t2中找到具有這些ID之一的項目。

根據您的統計信息,可用的索引,硬件,表大小:Sql Server可能會決定執行不同類型的掃描或試圖爲查詢的每個部分選擇數據,並且還可能決定將數據連接在一起某種方式。