在sqlserver2005中,部分原来在sqlserver 2000使用not in书写的语句有可能执行的非常慢,对整个系统的影响比较大,以下提供两种方法来替代,可获得较高的性能提升。
用not in 书写的语句非常易读,如
select count(*) from tbs_m_gds where c_gcode not in (select c_gcode from tbs_w_gds)
推荐用not exists代替,速度一般较快,但思路稍微要转一下弯
select count(*) from tbs_m_gds where not exists(select * from tbs_w_gds where tbs_w_gds.c_gcode=tbs_m_gds.c_gcode)
也可以用左连接来实现,但较难以理解,有时速度也较慢
select count(*)
from tbs_m_gds left join tbs_w_gds on tbs_w_gds.c_gcode=tbs_m_gds.c_gcode
where tbs_w_gds.c_gcode is null
应该注意,只要NOT IN连接与索引设置的合适(这个我还没找到规律),其效率很高甚至高于NOT EXISTS和LEFT JOIN,所以要对已发现的性能问题具体分析后再修改,也不必要全部修改掉,但今后新做的应尽量使用NOT EXISTS。