在Oracle中,什么是半连接(Semi Join)?
半连接(Semi Join)是一种特殊的连接类型,当做子查询展开时,Oracle经常会把那些外部WHERE条件为EXISTS、IN或= ANY的子查询转换为对应的半连接。半连接分为嵌套循环半连接(Hint为:NL_SJ)、排序合并半连接(Hint为:MERGE_SJ)和哈希半连接(Hint为:HASH_SJ),不过在新版本数据库里,都倾向于使用哈希半连接。不过哈希半连接也有一些限制条件,例如,只能使用等值连接、不能使用GROUP BY、CONNECT BY、ROWNUM等限制条件。在执行计划中若有关键字“HASH JOIN SEMI”,则说明Oracle使用了哈希半连接。示例如下所示:
1SELECT * FROM scott.DEPT A WHERE DEPTNO IN (SELECT /*+ HASH_SJ */ DEPTNO FROM scott.EMP); 2--------------------------------------------------------------------------- 3| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | 4--------------------------------------------------------------------------- 5| 0 | SELECT STATEMENT | | 3 | 69 | 7 (15)| 00:00:01 | 6|* 1 | HASH JOIN SEMI | | 3 | 69 | 7 (15)| 00:00:01 | 7| 2 | TABLE ACCESS FULL| DEPT | 4 | 80 | 3 (0)| 00:00:01 | 8| 3 | TABLE ACCESS FULL| EMP | 14 | 42 | 3 (0)| 00:00:01 | 9--------------------------------------------------------------------------- 10SELECT * FROM scott.DEPT A WHERE DEPTNO IN (SELECT /*+ MERGE_SJ */ DEPTNO FROM scott.EMP); 11---------------------------------------------------------------------------------------- 12| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | 13---------------------------------------------------------------------------------------- 14| 0 | SELECT STATEMENT | | 3 | 69 | 6 (17)| 00:00:01 | 15| 1 | MERGE JOIN SEMI | | 3 | 69 | 6 (17)| 00:00:01 | 16| 2 | TABLE ACCESS BY INDEX ROWID| DEPT | 4 | 80 | 2 (0)| 00:00:01 | 17| 3 | INDEX FULL SCAN | PK_DEPT | 4 | | 1 (0)| 00:00:01 | 18|* 4 | SORT UNIQUE | | 14 | 42 | 4 (25)| 00:00:01 | 19| 5 | TABLE ACCESS FULL | EMP | 14 | 42 | 3 (0)| 00:00:01 | 20---------------------------------------------------------------------------------------- 21SELECT * FROM scott.DEPT A WHERE DEPTNO IN (SELECT /*+ NL_SJ */ DEPTNO FROM scott.EMP); 22--------------------------------------------------------------------------- 23| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | 24--------------------------------------------------------------------------- 25| 0 | SELECT STATEMENT | | 3 | 69 | 10 (0)| 00:00:01 | 26| 1 | NESTED LOOPS SEMI | | 3 | 69 | 10 (0)| 00:00:01 | 27| 2 | TABLE ACCESS FULL| DEPT | 4 | 80 | 3 (0)| 00:00:01 | 28|* 3 | TABLE ACCESS FULL| EMP | 9 | 27 | 2 (0)| 00:00:01 | 29---------------------------------------------------------------------------
本文选自《Oracle程序员面试笔试宝典》,作者:李华荣。
详细内容可以添加麦老师微信或QQ私聊。
● 本文作者:小麦苗,只专注于数据库的技术,更注重技术的运用
● 作者博客地址:http://blog.itpub.net/26736162/abstract/1/
● 本系列题目来源于作者的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解
● 版权所有,欢迎分享本文,转载请保留出处
● QQ:646634621 QQ群:618766405
● 提供OCP、OCM和高可用部分最实用的技能培训
● 题目解答若有不当之处,还望各位朋友批评指正,共同进步
DBA宝典
长按下图识别二维码或微信扫描下图二维码来关注小麦苗的微信公众号:xiaomaimiaolhr,学习最实用的数据库技术。
本文分享自微信公众号 - DB宝(lhrdba)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。