Sql-Server-2005

向此查詢添加 order by 會比不添加 order by 返回更快,為什麼?

  • August 5, 2015

關於為什麼向此查詢添加排序返回比沒有排序要快得多的任何想法?我會期待相反的結果,那麼什麼會導致這種情況發生?

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 個匹配項之前執行子查詢的頻率低於按照查詢計劃程序預設選擇的順序執行結果時執行的頻率。

(我假設cs 應該是xs 或反之亦然,否則查詢將不會執行,因為別名c未在任何地方定義)

在啟用“實際查詢計劃”視圖的情況下,在 Management Studio 中執行類似的查詢是值得的 - 然後您可能會從圖中看到哪些部分導致了不同的性能。

引用自:https://dba.stackexchange.com/questions/634