oracle 11g中,会自动将in的底层操作改为联表。
当表的关联关系为一对多时,手动改为连表,还需要去重,这样的成本实际更高
SELECT *
FROM GY_SFXM gs
WHERE sfxm IN (SELECT sfxm FROM MS_SFMX ms )
与
SELECT DISTINCT gs.*
FROM GY_SFXM gs,
(SELECT sfxm FROM MS_SFMX ms ) b
WHERE gs.sfxm = b.sfxm
的效率比较
查看执行计划:
第一种
MERGE JOIN (SEMI) 排序合并半连接 即匹配到就返回
第二种
注意到,MERGE JOIN 这一步之前 CPU成本是一样的。而改为连表写法由于需要去重,消耗不少CPU成本。
所以在表的关联关系为一对多时,用in其实是更好的。