今天在项目即将跨入beta版测试的时候,把数据库里的数据增多了些,大概到了200万,想暴露些性能问题。结果大部分读取数据的时间都非常长。通过sql profile找到sql语句:
select * from (select OrderBasicInfo.*, ROW_NUMBER() Over(order by OrderID) as rowNum
from 
OrderBasicInfo 
join AgentBasicInfo AB on AB.AgentID = OrderBasicInfo.AgentID 
join MerchantBasicInfo MB on MB.MerchantID = OrderBasicInfo.MerchantID 
join SystemCode SC on (SC.CodeValueInt = OrderBasicInfo.OrderStatus and SC.SysCodeTypeID = 600)
where orderbasicinfo.orderstatus=3

目前在这些表中,只建了主键,没有建其他索引了,观察到有个订单状态的条件,
还没有建立索引,我就给它建了一个,果然,一测试,结果马上就出来了,0秒!当然我的确很兴奋。
但是事情还没有结束,当我改变查询条件,求取orderstatus = 3 的时候,查询结果却延迟到了25秒才出来。这个是为什么呢?原来,在orderbasicinfo表中,orderstatus为3的订单,占绝大多数,比率有99.99%!所以,即使建了非聚集索引,速度还是比较慢!
得出结论:
      在建非聚集索引的时候,只有经常用到的条件字段,并且在字段所占比率中,较小的时候,非聚集索引才会起到好的效果,如果起不到好的效果,那么就要权衡增删改对索引重排和磁盘空间的问题了,考虑建这个非聚集索引又没有这个必要。