在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程序员面试笔试宝典》,做者:李华荣。
sql
详细内容能够添加麦老师微信或QQ私聊。数据库
● 本文做者:小麦苗,只专一于数据库的技术,更注重技术的运用微信
● 做者博客地址:http://blog.itpub.net/26736162/abstract/1/网络
● 本系列题目来源于做者的学习笔记,部分整理自网络,如有侵权或不当之处还请谅解app
● 版权全部,欢迎分享本文,转载请保留出处ide
● QQ:646634621 QQ群:618766405学习
● 提供OCP、OCM和高可用部分最实用的技能培训spa
● 题目解答如有不当之处,还望各位朋友批评指正,共同进步
长按下图识别二维码或微信扫描下图二维码来关注小麦苗的微信公众号:xiaomaimiaolhr,学习最实用的数据库技术。
本文分享自微信公众号 - DB宝(lhrdba)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。