需求:
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. 有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性能优化
可以试一下sp_recompile,或者建立索引。
给where条件里的A,B添加索引应该是解决的最好方法了,条件B放在后面。
where b是函数,所以慢。
如果是按照步骤来执行 where a 过滤出 1000跳 ; where b过滤出800 条,是没问题的,速度很快
但是 在一条SQL里执行,就会非常慢,看查询计划,b的开销很大,绝对不是拿1000条数据去和b来对比
直接写到where子句中
where a and where b
耗时2分钟以上
这个慢的话可以理解,MSSQL有个同时运行的概念,就是同一逻辑阶段都是同时运行的。所以a和B都是同一时间
运行,并不会先a后b.
第三个就不知道怎么回事了。