在sqlserver2005中,部分原來在sqlserver 2000使用not in書寫的語(yǔ)句有可能執(zhí)行的非常慢,對(duì)整個(gè)系統(tǒng)的影響比較大,以下提供兩種方法來替代,可獲得較高的性能提升。
用not in 書寫的語(yǔ)句非常易讀,如
select count(*) from tbs_m_gds where c_gcode not in (select c_gcode from tbs_w_gds)
推薦用not exists代替,速度一般較快,但思路稍微要轉(zhuǎn)一下彎
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)
也可以用左連接來實(shí)現(xiàn),但較難以理解,有時(shí)速度也較慢
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
應(yīng)該注意,只要NOT IN連接與索引設(shè)置的合適(這個(gè)我還沒找到規(guī)律),其效率很高甚至高于NOT EXISTS和LEFT JOIN,所以要對(duì)已發(fā)現(xiàn)的性能問題具體分析后再修改,也不必要全部修改掉,但今后新做的應(yīng)盡量使用NOT EXISTS。