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的字樣。
也可以手動指定不需要走半連接。使用Hint no_semijoin
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的oracle 半连接 效率,关于oracle中的半连接的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux的oracle最低配置,Ora
- 下一篇: oracle 查询spid,查看数据库s