SQL Server - 2008排名功能效率

时间:2016-05-15 18:25:46

标签: sql-server

我有以下两个排名函数给我相同的结果,但有人可以提供哪些方式更有效的信息,或者这仅仅是个人偏好的情况?

一个使用表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

2 个答案:

答案 0 :(得分:0)

首先,dense_rank()可能完全取消distinct的任何性能影响。如果您使用完整查询提出另一个问题,那么可能会提高效率。

其次,从性能角度来看,唯一感兴趣的是authid上是否存在索引。第二个最佳索引为(authid, dcm_id desc),第一个索引为类似索引。

好的,可能会有一些差别,因为排序列在第一种情况下比第二种情况稍长一些(假设所有内容都是简单类型)。但实际上,考虑到这种性能差异无疑是不成熟的优化。

答案 1 :(得分: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>)

还可以创建一个涵盖两者的索引,包括聚集索引。