oracle 半连接 效率,关于oracle中的半连接

表的连接在sql语句中尤为重要。外连接,内连接,半连接,反连接等等各种连接,看似简单的一个连接里面还是有不少的细节的。对于sql调优来说也是很重要的。

像下面的形式的sql就属于半连接,使用了in子句,对于exists的实现也是属于半连接。

--in半连接

SQL> select dname from dept dept where deptno in (select deptno from emp emp);

DNAME

--------------

RESEARCH

SALES

ACCOUNTING

--exists半连接

SQL> select dname from dept dept where exists (select null from emp emp where emp.deptno=dept.deptno)

2  /

DNAME

--------------

RESEARCH

SALES

ACCOUNTING

可能对于上面两种连接大家不以为然,认为把需要用到的表直接放在from子句后效果是一致的,答案也不是肯定的。

比如下面的形式,可能输出的结果就多了很多。大概14条记录,但是通过半连接的方式会输出3行记录。

SQL> select dept.dname from dept dept,emp empwhere dept.deptno=emp.deptno;

DNAME

--------------

RESEARCH

SALES

SALES

RESEARCH

SALES

SALES

ACCOUNTING

RESEARCH

ACCOUNTING

SALES

RESEARCH

SALES

RESEARCH

ACCOUNTING

14 rows selected.

所以说如果要得到一个相同的输出结果,还是需要distinct+inner join

SQL> select distinctdept.dname from dept dept,emp emp where dept.deptno=emp.deptno;

DNAME

--------------

ACCOUNTING

RESEARCH

SALES

对于半连接的可替换实现,大体有以下几种方式

--使用集合

select dept.dname from dept dept,

(select deptno from dept

intersect

select deptno from emp emp)b

where dept.deptno=b.deptno ;

DNAME

--------------

ACCOUNTING

RESEARCH

SALES

--使用any

SQL> select dept.dname from dept dept where deptno=any(select deptno from emp emp);

DNAME

--------------

RESEARCH

SALES

ACCOUNTING

--使用distinct和内连接

SQL> select distinct emp.deptnofrom dept dept,emp emp

where dept.deptno=emp.deptno;

DEPTNO

----------

30

20

10

SQL> select distinct dept.deptnofrom dept dept,emp emp

where dept.deptno=emp.deptno;

DEPTNO

----------

30

20

10

大体说了下关于半连接的一些实现,可能在实际的使用中,最直观的感受还是通过执行计划来看到。

启用了半连接,在执行计划中会有semi的字样。

e5f9ca1ba6649b4af415015b868a9484.png

也可以手动指定不需要走半连接。使用Hint no_semijoin

65f2341adaa891c9bd07deaedb7a01dc.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值