在sqlserver2005中,部分原來在sqlserver 2000使用not in書寫的語句有可能執(zhí)行的非常慢,對整個系統(tǒng)的影響比較大,以下提供兩種方法來替代,可獲得較高的性能提升。
用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)
也可以用左連接來實現(xiàn),但較難以理解,有時速度也較慢
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連接與索引設置的合適(這個我還沒找到規(guī)律),其效率很高甚至高于NOT EXISTS和LEFT JOIN,所以要對已發(fā)現(xiàn)的性能問題具體分析后再修改,也不必要全部修改掉,但今后新做的應盡量使用NOT EXISTS。