日期:2014-05-18  浏览次数:20593 次

帮忙优化一下,执行速度很慢,谢谢!
select TA001,TA002,TA006,TA034 from MOCTA where TA001+TA002 not in (select TA001+TA002 from SFCTA) 
AND TA011 ='1' or TA011='2' or TA011='3' 
ORDER BY TA006,TA001,TA002 ASC

------解决方案--------------------
SQL code

--try
select TA001,TA002,TA006,TA034 from MOCTA where not exists (select 1 from SFCTA s where MOCTA .TA001=s.TA001 and MOCTA .TA002=s.TA002 )

AND TA011 ='1' or TA011='2' or TA011='3'  
ORDER BY TA006,TA001,TA002 ASC

------解决方案--------------------
not in 或者not exists会导致全表扫描。,建议不要放到where的前面,因为where子句是从左到右顺序执行的,应该考虑索引的顺序,然后where子句中严格按照索引顺序来写,如果没有索引,那么要考虑放在前面的字段筛选能否快速地减少数据量。另外,对于一些分布零散的列,比如type,最好不要放到前面。order by 的时候,如果实在需要这样order by ,那么可以考虑聚集索引是否有必要按这个排序方式来创建,以减少查询中order by 的开销