悬赏分:10 浏览:245 次
通过执行计划分析来看,使用 ROW_NUMBER() 的时候,好像没有利用非聚集索引
with t_pager as (
select *,myIndex = ROW_NUMBER() OVER (ORDER BY Empcode ) FROM Employee
where EmpTypeID = 2
)
SELECT * from t_pager WHERE myIndex between 11 and 20;
Empcode ,EmpTypeID 这两个字段加不加非聚集索引,计划分析的结果都是一样的。只有按照主键排序,计划分析才会不一样。
分页结果倒是正确的。效率好像还很高。严重不解中。
|
sql按照那一个索引进行查询是查询优化器做的,除非你在sql语句中指定根据那个索引来查(参考:http://www.google.cn/search?hl=zh-CN&q=%E6%8C%87%E5%AE%9A%E7%B4%A2%E5%BC%95%E6%9F%A5%E8%AF%A2&meta=&aq=f)。 但是一般不推荐指定索引。 |
|
2个月前 电机拖动 : 哦,不好意思,我没说清楚,我的意思是:DESC时的分页结果不同,而计划几乎一样(成本一样)。这个效果说明了聚集索引与非聚集索引的区别。 排序的确占资源,不过,当排序的集合比较小时,自然就不占资源了 另外,针对你的问题,非聚集索引的存储机制就决定了它不会在排序时一定起作用。你这个查询非常简单,因此,只要你的Empcode的排序与聚集索引一致(不是DESC或ASC那么简单,而逻辑上)即可实现取消排序的效果。如果是较为复杂的,就算是有聚集索引都不一定能取消排序操作。 此外,还要看你的SORT操作到底成本是怎么样的,如果比较低,比如1%,那么需要优先优化的对象就不应该是它了 另外,根据你的表名,我估计你这个表的主键应该是EmployeeID,你的主键再使用默认设置,白白的浪费了聚集索引这么紧俏的资源…… |