oracle执行计划中NESTED LOOPS SEMI (即半嵌套循环)的解释

php中文网
发布: 2016-06-07 15:46:13
原创
1984人浏览过

在存在in的 子查询的 SQL语句和存在 EXISTS 的相关子查询的 SQL语句 的执行计划里,有NESTED LOOPS SEMI (即半嵌套循环)。 所谓的 NESTED LOOPS SEMI (即半嵌套循环) ,就是 the out query stops evaluating (评价, 求…的数 )the result set of the

在存在in的子查询的SQL语句和存在EXISTS的相关子查询的SQL语句的执行计划里,有NESTED LOOPS SEMI (即半嵌套循环)。

所谓的nested loops semi (即半嵌套循环),就是

the out query stops evaluating (评价,求…的数值)the result set of the inner query when the first value is found。

也就是说,一旦子查询的第一条结果出来,主查询(里的表的当前行)就停止子查询的继续进行执行。


NESTED LOOPS SEMI (即半嵌套循环)执行过程的伪代码如下:

  1. open tab1  (主查询里的表
  2.  while tab1 still has records  
  3.     fetch one record from tab1  
  4.    (并且) result = false  (即将变量result的值置为alse
  5.     open tab2  
  6.     while tab2 still has records  
  7.         fetch one record from tab2  
  8.         if(根据tab1.record 和 tab2.record的值执行一次子查询语句所得的结果集不为空) then  
  9.            result = true  
  10.            (并且)exit loop2 
  11.          end if  
  12.     end loop2 
  13.     close tab2  
  14.     if (result = true) return tab1 record  
  15.  end loop1 
  16.  close tab1 
注释:

  • fetch one record from tab1  
  • result = false  (即将变量result的值置为alse
  • open tab2
  • 这三条语句是并列的关系 


  • result = true  
  • exit loop2 
  • 这两条语句是并列的关系 


    在存在in的SQL语句的执行计划里的NESTED LOOPS SEMI (即半嵌套循环):


    [html] view plaincopy

    1. gyj@MYDB> set autot traceonly;  
    2. gyj@MYDB> select * from t4 where id in (select id from t3);  
    3.   
    4. 9 rows selected.  
    5.   
    6.   
    7. Execution Plan  
    8. ----------------------------------------------------------  
    9. Plan hash value: 1092212754  
    10.   
    11. -----------------------------------------------------------------------------  
    12. | Id  | Operation          | Name   | Rows  | Bytes | Cost (%CPU)| Time     |  
    13. -----------------------------------------------------------------------------  
    14. |   0 | SELECT STATEMENT   |        |     9 |    99 |    21   (0)| 00:00:01 |  
    15. |   1 |  NESTED LOOPS SEMI |        |     9 |    99 |    21   (0)| 00:00:01 |  
    16. |   2 |   TABLE ACCESS FULL| T4     |     9 |    54 |     3   (0)| 00:00:01 |  
    17. |*  3 |   INDEX RANGE SCAN | IDX_T3 |   999K|  4882K|     2   (0)| 00:00:01 |  
    18. -----------------------------------------------------------------------------  
    19.   
    20. Predicate Information (identified by operation id):  
    21. ---------------------------------------------------  
    22.   
    23.    3 - access("ID"="ID")  
    24.   
    25.   
    26. Statistics  
    27. ----------------------------------------------------------  
    28.           1  recursive calls  
    29.           0  db block gets  
    30.          20  consistent gets  
    31.           0  physical reads  
    32.           0  redo size  
    33.         723  bytes sent via SQL*Net to client  
    34.         520  bytes received via SQL*Net from client  
    35.           2  SQL*Net roundtrips to/from client  
    36.           0  sorts (memory)  
    37.           0  sorts (disk)  
    38.           9  rows processed  


    存在EXISTS的相关子查询的SQL语句的执行计划里的NESTED LOOPS SEMI (即半嵌套循环)


    [html] view plaincopy

    1. open tab1  
    2.  while tab1 still has records  
    3.     fetch  record from tab1  
    4.     result = false  
    5.     open tab2  
    6.     while tab2 still has records  
    7.         fetch record from tab2  
    8.         if(tab1.record matches tab2.record) then  
    9.            result = true  
    10.            exit loop  
    11.          end if  
    12.     end loop  
    13.     close tab2  
    14.     if (result = true) return tab1 record  
    15.  end loop  
    16.  close tab1 

    注释:

    1#

  • EXISTS谓词非常简单,它是对一个非空集的测试。如果在其子查询中存在任何行,则返回TRUE,否则为FALSE。该谓词不会返回UNKNOWN结果。EXIST()谓词语法如下: ::=[NOTEXISTS]

    2#

  • 执行计划中,若一个父操作有两条并列的子操作时,其执行模式之一是:

    第一条子操作都是先执行,其影响下一条并列的子操作执行,也就是说第一条子操作遍历一遍表A后父操作才算结束,当该子操作遍历一行表A上的数据时,另一个子操作就会遍历一遍表B。例如,

    1. |    1 |  NESTED LOOPS SEMI |                |     9      |    99 |    21   (0)| 00:00:01 |  
    2. |    2 |   TABLE ACCESS FULL| T4          |     9      |    54 |     3   (0)| 00:00:01 |  
    3. |*  3 |   INDEX RANGE SCAN   | IDX_T3 |   999K|  4882K|     2   (0)| 00:00:01 | 
    源自:关于嵌套查询(nested query)的深入理解

    参见:

    [每日一题] OCP1z0-047 :2013-08-08 相关子查询中EXISTS的使用.....................................28


     


  • 最佳 Windows 性能的顶级免费优化软件
    最佳 Windows 性能的顶级免费优化软件

    每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

    下载
    相关标签:
    来源:php中文网
    本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
    最新问题
    开源免费商场系统广告
    热门教程
    更多>
    最新下载
    更多>
    网站特效
    网站源码
    网站素材
    前端模板
    关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送
    PHP中文网APP
    随时随地碎片化学习
    PHP中文网抖音号
    发现有趣的

    Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号