select *
from cj_record WITH(NOLOCK) WHERE order_no = 'PD-20130823-0018'检索出来的数据有7万多条,大概花了6到7秒完成  select order_no,sum(period_time)
from cj_record WITH(NOLOCK) WHERE order_no = 'PD-20130823-0018'
group by order_no而统计period_time这个数值则花掉6秒左右时间。order_no字段为非集聚索引,cj_record大概有300万条记录。请问各位大虾,如何才能优化数据库,使得统计数据更快!
谢谢了!  

解决方案 »

  1.   

    初步判断应该是排序导致的,尝试:
    方法1、在period_time和order_no上创建一个非聚集索引,即两列组合一个索引
    方法2、把order_no改为聚集索引,不过这个方法通常都不可行。
    另外给出执行计划看看。
      

  2.   

    建OrderNo+Period_Time包含索引就OK
    2008支持 OrderNo Include (Period_Time)
    2005忘了是否支持
      

  3.   

    在order_no字段的非集聚索引上include 入period_time列看看。
      

  4.   

      select order_no,sum(period_time)
    from cj_record WITH(NOLOCK) WHERE order_no = 'PD-20130823-0018'
    group by order_no你sql写的有问题吧?
     WHERE order_no = 'PD-20130823-0018'
    group by order_no这有意义吗?
      

  5.   


    建立索引,速度应该能提升:create index idx_cj_record_op on cj_record(order_no,period_time)
      

  6.   


    我比较支持2楼的做法,include索引
      

  7.   


    我比较支持2楼的做法,include索引include也可以的,采用include后,在建索引时就不用对period_time列进行排序了,可以省点力。
      

  8.   

    只需要在record表上建聚集复合索引order_no,period_time,或者建非聚集复合索引order_no,period_time采用include看看那个速度快就选择那个。
      

  9.   

    谢谢各位,增加复合索引order_no,period_time一下子提高了