需求:
1. 有Table_a表,数据量很大,比如1000万跳数据
2. 有where条件 a,执行速度非常快,从1000万跳数据中过滤出1000条数据
3. 有where条件 b,执行速度非常慢,从1000条数据过滤出800条方法一:
查出过滤条件a的1000条数据放入临时表,
从临时表里查出过滤条件b的数据,
耗时不到1s方法二:
直接写到where子句中
where a and where b
耗时2分钟以上方法3:
用子查询
selec  *
from   (select * from table_a where a) a 
where  b
依然耗时2分钟以上网上找了下SQL的解析方法,from子查询是会解析成连接,
我想这可能是导致子查询慢的原因。请问:
如果不借助临时表,如何优化以上的SQL?SQL Server性能优化

解决方案 »

  1.   

    可以根据where a and  b 来添加索引
      

  2.   

    你试帖出你的完整sql语句出来, 并且给出表结构明细
     
      

  3.   

    肯定是 where b 用法有问题,1000条数据应该很快。
      

  4.   

    DBCC SHOW_STATISTICS (Table_A, ColumnName) 看数据分布。分布特别不均匀可能导致SQL SERVER使用效率低的query plan。
    可以试一下sp_recompile,或者建立索引。
    给where条件里的A,B添加索引应该是解决的最好方法了,条件B放在后面。
      

  5.   

    索引都建了的
    where b是函数,所以慢。
    如果是按照步骤来执行 where a 过滤出 1000跳 ; where b过滤出800 条,是没问题的,速度很快
    但是 在一条SQL里执行,就会非常慢,看查询计划,b的开销很大,绝对不是拿1000条数据去和b来对比
      

  6.   

    方法二:
    直接写到where子句中
    where a and where b
    耗时2分钟以上
    这个慢的话可以理解,MSSQL有个同时运行的概念,就是同一逻辑阶段都是同时运行的。所以a和B都是同一时间
    运行,并不会先a后b.
    第三个就不知道怎么回事了。
      

  7.   

    where b函数应该是不走你建的索引的,最好b=函数