select a,b,c,d from A inner join B on A.a=b.a where A.time>='2012-01-01 00:00:00' and A.time<='2012-01-31 23:59:59' 
order by A.time desc
查询出得数据量在10万左右,但不加order by速度很快,加了order by几乎等死,A.time是datetime格式,已经加了索引,还是查询很慢,估计查询出的10万条记录正在排序,order by又不能去除,如何优化?

解决方案 »

  1.   

    很明显,在time上加聚集索引.
    不过这样操作之前,你得慎重考虑一下,对time的查询是否足够频繁,如果频繁,那毫不犹豫了.否则不要轻易改变表的聚焦索引,试方式
    加上非聚焦索引吧.
      

  2.   


    --测试一下,有变化没?
    select  a ,
            b ,
            c ,
            d
    from    A
            inner join b on A.a = b.a
    where   A.time between '2012-01-01' and '2012-02-01'
    order by A.time desc 
      

  3.   


    Select * From (
      select a,b,c,d
        from A
        inner join B
          on A.a=b.a
        where A.time>='2012-01-01 00:00:00' and A.time<='2012-01-31 23:59:59'  
    ) as aa
    order by aa.time desc先将结果做成一个结果集,然后再进行排序。看数据量,总表与结果表大小差别越大,速度差别也就越大。
      

  4.   

    从描述上来看主要是排序影响的.你要按a表的time字段排序,则可以在time字段上面建立一个聚集索引
    正好满足你的范围查找且加排序
      

  5.   

    1. 你的硬件设施太落后了 才这点数据就这样了
    2.加time 索引
      

  6.   

    1.between and试过了,没多大变化,time主要是有秒的,是日期速度也不会这么慢了
    2。索引加了不过效果还是不理想
    3.硬件条件因为是我本机测试所以差了点
      

  7.   

    如果2008,把time上的索引删除,然后执行create index IX_a_time on a(time) include(a,b,c,d) --如果这四个字段有些不是A表的,不要这个字段