以文本方式查看主题

-  昂捷论坛  (http://www.enjoyit.com.cn/bbs/index.asp)
--  □-技术研讨会  (http://www.enjoyit.com.cn/bbs/list.asp?boardid=36)
----  推荐提高 not in 的效率的方法  (http://www.enjoyit.com.cn/bbs/dispbbs.asp?boardid=36&id=2404)

--  作者:飞絮
--  发布时间:2006/11/24 15:29:50
--  推荐提高 not in 的效率的方法

在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。