Sql-Server-2005
向此查詢添加 order by 會比不添加 order by 返回更快,為什麼?
關於為什麼向此查詢添加排序返回比沒有排序要快得多的任何想法?我會期待相反的結果,那麼什麼會導致這種情況發生?
SELECT TOP (500) r.cID,r.aField,a.Description FROM dbo.tblR r inner join dbo.tblA a on r.aID = a.ID left join dbo.tblX x on x.cID = r.cID WHERE (ISNULL(x.anotherField,'') <> r.anotherField or x.field3 is null) and (r.ID=(select max(ID) from tblR where cID = r.cID and ISNULL(aField,'') <> '')) and r.cID in (select ID from tblC) ORDER BY r.cID ASC -- when I comment this line out it runs much slower
執行計劃沒有多大幫助。
最明顯的原因是子句中
(select max(ID) from tblR where cID = c.cID and ISNULL(aField,'') <> '')
的子查詢與 theWHERE
相結合TOP 500
使順序有所不同。在任何一種情況下,它都可能會為它可能返回的每一行單獨執行該子查詢,直到它找到與整個匹配的 500 個
WHERE
(實際上,它會足夠亮以首先檢查 WHERE 的其他部分,因為它們是便宜得多,但它仍然會為它遇到的部分行執行子查詢)。猜測一下,目前按 c.cID 排序時,靠近頂部的行更多匹配,因此它必須在找到 500 個匹配項之前執行子查詢的頻率低於按照查詢計劃程序預設選擇的順序執行結果時執行的頻率。(我假設
c
s 應該是x
s 或反之亦然,否則查詢將不會執行,因為別名c
未在任何地方定義)在啟用“實際查詢計劃”視圖的情況下,在 Management Studio 中執行類似的查詢是值得的 - 然後您可能會從圖中看到哪些部分導致了不同的性能。