sqlserver group by 非聚集多字段组合索引性能慢的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sqlserver group by 非聚集多字段组合索引性能慢的问题相关的知识,希望对你有一定的参考价值。

参考技术A

执行下面的查询:

性能很慢。
解释执行计划中发现:走的是 “索引扫描” 。并非命中 “索引查找” 即未正确命中 Index_ItemCode_avg_time

解释执行计划中发现:走的仍旧是 “索引扫描” ,说明我们建立的 Index_ItemCode_avg_time 有问题。

解释执行计划中发现:走的是 “RID查找” 。
RID查找 是什么呢?就是说sql先根据 time 条件字段 “索引查找” , 然后再回去把其他字段查出来(这个过程叫RID查找)

从测试上来看,并结合查找相关资料,我们的多字段组合索引的顺序可能出了问题。
下面调整一下索引顺序:

解释执行计划中发现:走的是 “索引查找” 。
解决。

多字段的组合索引在建立的时候要考虑两个问题:

sqlserver中分区函数 partition by与 group by 区别 删除关键字段重复列

partition  by关键字是分析性函数的一部分,它和聚合函数(如group by)不同的地方在于它能返回一个分组中的多条记录,而聚合函数一般只有一条反映统计值的记录,

partition  by用于给结果集分组,如果没有指定那么它把整个结果集作为一个分组。

partition by 与group by不同之处在于前者返回的是分组里的每一条数据,并且可以对分组数据进行排序操作。后者只能返回聚合之后的组的数据统计值的记录。

 

用法 : select *,ROW_NUMBER() over( partition by Name order by Score )  as newrow
from table

删除关键字段重复列

@newtable  ---表名 

@key  --自增列

@repeate  ---查重复的关键字段

delete ‘ [email protected]+‘ where ‘ [email protected]+‘ in(select ‘ [email protected]+‘ from (select *,RANK() over(partition by ‘[email protected]+‘  order by ‘[email protected]+‘ ) as newrow from ‘[email protected]+‘) nt where nt.newrow>1)



以上是关于sqlserver group by 非聚集多字段组合索引性能慢的问题的主要内容,如果未能解决你的问题,请参考以下文章

sqlserver中分区函数 partition by与 group by 区别 删除关键字段重复列

sqlserver2008,sql编程,group by 用法

sqlserver2008,sql编程,group by 用法

sqlserver的索引

sqlserver2008,sql编程,group by 用法

oracle select非group by的字段