select top 100 * from A
                     d  JOIN V1 c on d.F1=c.F1 
                     JOIN B b 
                     on d.F1=b.1 
where FState=1 and FIsSafe='是' 
order by d.FTime
A表单表有700W条数据。主要问题是order by d.Time,要1分多钟才出来,而且看执行计划,貌似整个表遍历了一次
如果我换成order by d.Time desc 3秒就出结果了。FState与FIsSafe都有加索引(asc),也有加一个联合索引(FState,FIsSafe)传送门:http://bbs.csdn.net/topics/390507709

解决方案 »

  1.   

    order by d.Time desc和不加DESC对于数据库的执行计划有什么区别?
      

  2.   


    不加desc,看执行计划,执行次数就相当于整个表的数据量了如果语句:select top 100 * from A
                         d  JOIN V1 c on d.F1=c.F1 
                         JOIN B b 
                         on d.F1=b.1 
    where FState=1 
    order by d.FTime不要FIsSafe条件,也是几秒就出结果了。为什么呢。  我表达的可能不太好。
      

  3.   

    1. 确保F1=c.F1 表关联的的几个字段 建立了索引
    2. ORDERBY后面的字段建立了索引,如果经常是desc排序的,那么建立索引可以直接建立倒叙排序的索引
    3. 组合索引可以考虑建立
    4。打开查询计划和执行开关 ,分析开销大的,并通过走索引等方式降低开销从而提升查询效率
      

  4.   

    在A表FTime字段上建asc索引试试..另建议不要用"select * ..",把需要返回的字段列出来.