题目         部分

在Oracle中,什么是半连接(Semi Join)?


     
         答案部分          


半连接(Semi Join)是一种特殊的连接类型,当做子查询展开时,Oracle经常会把那些外部WHERE条件为EXISTSIN= ANY的子查询转换为对应的半连接。半连接分为嵌套循环半连接(Hint为:NL_SJ)、排序合并半连接(Hint为:MERGE_SJ)和哈希半连接(Hint为:HASH_SJ),不过在新版本数据库里,都倾向于使用哈希半连接。不过哈希半连接也有一些限制条件,例如,只能使用等值连接、不能使用GROUP BYCONNECT BYROWNUM等限制条件。在执行计划中若有关键字“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私聊。



About Me:小麦苗      

 本文作者:小麦苗,只专注于数据库的技术,更注重技术的运用

● 作者博客地址:http://blog.itpub.net/26736162/abstract/1/

 本系列题目来源于作者的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解

 版权所有,欢迎分享本文,转载请保留出处

 QQ:646634621  QQ群:618766405

 提供OCP、OCM和高可用部分最实用的技能培训

● 题目解答若有不当之处,还望各位朋友批评指正,共同进步

DBA宝典

长按下图识别二维码或微信扫描下图二维码来关注小麦苗的微信公众号:xiaomaimiaolhr,学习最实用的数据库技术。

喜欢就点击“好看”吧



本文分享自微信公众号 - DB宝(lhrdba)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

©著作权归作者所有:来自51CTO博客作者小麦苗DB宝的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 【DB笔试面试846】在Oracle中,TWO_TASK环境变量的作用是什么?
  2. 【DB笔试面试249】在Oracle中,生成备库控制文件的方法有哪些?
  3. 【DB笔试面试845】在Oracle中,sqlnet.ora文件的作用是什么?
  4. 【DB笔试面试571】在Oracle中,如何提高DML语句的效率?
  5. 【DB宝31】Oracle DG环境中主库使用rman做不完全恢复后,备库如何
  6. Python内置数据库SQLite
  7. Python操作SQL Server(一)连接SQL server
  8. 【高可用】Oracle高可用培训(RAC+DG+OGG)--包括11g、12c、18c、19c
  9. Oracle连接MongoDB数据库

随机推荐

  1. Android中自定义shape
  2. Android 动态加载(二) - 基础篇(二)
  3. android常用的一些属性说明
  4. android笔记(一)
  5. Android SDK离线快速安装教程 Android SD
  6. Android(安卓)Studio 错误: 非法字符: '
  7. Android 动态加载(三) - 类的加载流程源码
  8. Android Layout属性笔记
  9. 《Android 从初学者入门到成为高手 视频
  10. Android使用fitsSystemWindows属性实现–