首页 > Oracle > Oracle 特殊的连接方式—半连接,反连接,内外连接!
2014
02-19

Oracle 特殊的连接方式—半连接,反连接,内外连接!

这几种连接方式在平时开发sql当中也是非常常见的,对这几种连接方式没有什么好解释的,作为一个开发人员来讲,可以说对这几种连接方式非常熟悉了。

半连接semi-join,指两个表做join的时候,只返回某一个表中的数据,在执行计划中看到nested loops semi/hash join semi就表示有半连接。

反连接其实就是特殊的半连接,在半连接中,经常写in/exist的写法,反连接就是把in/exist写成 not in/not exist,在执行计划中看到nested loops anti/hash join anti就表示有反连接。

但这里就需要注意了,在反连接的时候,如果需要优化sql,改写sql的话,一定要注意去掉null值,如果not in或者not exists的子查询包含null值的话,那么sql就不会返回结果。在网络上,有很多文章详细讨论过in和exists的效率问题,在这里我就不单方面做出说明了,仁者见仁智者见智吧,我个人认为网上有很多结论并不是可信的。根据我优化过的sql来分析,在一般情况下,比较简单的sql,in和exists的执行计划差不多是一致的,但是如果sql比较复杂,那用in和exists效率就大不一样了。以后有案例,我贴上来给大家分享下。

内外连接,这种非常常见的写法就不用多说了吧。至于介绍大家可以看看其他文章,这里说说关于内外连接的优化。在有外连接的时候,用leading是不能改变驱动表的顺序,而且走nested loops的时候,也无法改变驱动表的顺序,但是当走hash join的时候,可以用swap_join_inputs和no_swap_join_inputs来改变驱动表的顺序,这个hint估计大家用得不是很多。不过在此处只有用着hint改变驱动表的顺序。

最后编辑:
作者:Jerry
一个积极向上的小青年,热衷于分享--Focus on DB,BI,ETL