2016-05-15 88 views
0

我有兩個下面的排名函數給了我相同的結果,但有人可以提供哪些方式更有效的信息,或者這僅僅是個人喜好的情況?SQL Server - 2008排名函數效率

一個使用表PK,另一個使用該ID的最新UpdateDate。

select Distinct 
DENSE_RANK() OVER 
(PARTITION BY a2.id ORDER BY a2.updateddate DESC) seq_LatestUpdate_Date, 
DENSE_RANK() OVER 
(PARTITION BY a2.id ORDER BY a2.cdm_id DESC) seq_LatestUpdate_ID 
+0

您是否使用SHOW ESTIMATED EXECUTION PLAN檢查了兩個查詢的估計成本? –

+0

我想''''在第一個'DESC'之後缺少''''。否則您的查詢無效。 – lad2025

回答

0

首先,dense_rank()的任何性能影響很可能完全由distinct撤消。如果您在完整查詢中提出另一個問題,則可能會提高效率。

其次,從性能角度來看唯一感興趣的是索引是否存在於authid。第二個最好的索引是(authid, dcm_id desc),第一個索引也是類似的索引。

好的,可能會有一點區別,因爲排序列在第一種情況下比在第二種情況下稍長(假定所有事情都是簡單類型)。但是真的,考慮到這種性能差異無疑是不成熟的優化。

0

根據您發佈的內容,兩者之間不會有任何性能差異。

作爲一般規則,如果其中一個原因在執行計劃中排序,另一個則不然,那麼需要排序的原因將會變慢。

正如書面都需要排序。爲了防止排序爲第一個你會希望這個指數:

CREATE INDEX nc_xxx1 ON a2(id, updateddate DESC) INCLUDE (<other rows returned by your query>) 

對於第二你想這個指數:

CREATE INDEX nc_xxx2 ON a2(id, cdm_id DESC) INCLUDE (<other rows returned by your query>) 

它也可以創建一個涵蓋,包括索引你聚簇索引。