oracle swap_join_inputs,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改变驱动表的顺序。

转载请注明: 版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!

最后编辑:2014-02-19作者:Jerry

61f384f23c24a3306817dc87a6906c2d.png

一个积极向上的小青年,热衷于分享--Focus on DB,BI,ETL

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值