在Oracle 10g下。来到scott用户下。分别以层次 1,2,3,4上的节点做实验:

当start with是根节点(level=1),要查其子节点,connect by pump和emp都是被扫描4次(总的层次)。

当start with是根节点(level=2),要查其子节点,connect by pump和emp被扫描3次。

当start with是根节点(level=3),要查其子节点,connect by pump和emp被扫描2次。

当start with是根节点(level=4),要查其子节点,connect by pump和emp被扫描1次。

注意的是:leve=2,level=3不是叶子节点,假设是叶子节点,那connect by pump和emp仅仅扫描一次。

Operation             Name     Starts

FILTER              

    TABLE ACCESS FULL     EMP        1

  HASH JOIN           

    CONNECT BY PUMP                  4

    TABLE ACCESS FULL     EMP        4

我来解读上面的运行计划,以start with ename = 'KING'为例,显示对EMP通过"ENAME"='KING'过滤找到节点作为根节点(集合A),通过集合A到下一级全部满足条件的节点(集合B),通过集合B再到下一级全部满足条件的节点(集合C),树有几级就CONNECT
BY PUMP几次。

SQL> set pagesize 100

SQL> --根节点 level=1

SQL> select e.empno, e.ename, e.mgr, e.deptno,level

      from emp e

     start with ename = 'KING'

    connect by prior empno = mgr;



     EMPNO ENAME             MGR     DEPTNO      LEVEL

---------- ---------- ---------- ---------- ----------

      7839 KING                          10          1

      7566 JONES            7839         20          2

      7788 SCOTT            7566         20          3

      7876 ADAMS            7788         20          4

      7902 FORD             7566         20          3

      7369 SMITH            7902         20          4

      7698 BLAKE            7839         30          2

      7499 ALLEN            7698         30          3

      7521 WARD             7698         30          3

      7654 MARTIN           7698         30          3

      7844 TURNER           7698         30          3

      7900 JAMES            7698         30          3

      7782 CLARK            7839         10          2

      7934 MILLER           7782         10          3

已选择14行。

SQL> select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));

PLAN_TABLE_OUTPUT

-----------------------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------

SQL_ID  6as71p9t5arg3, child number 0

-------------------------------------

select e.empno, e.ename, e.mgr, e.deptno,level   from emp e  start with ename = 'KING' connect by prior empno

= mgr

Plan hash value: 3364448299

-----------------------------------------------------------------------------------------------------------------------

| Id  | Operation                 | Name | Starts | E-Rows | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |

-----------------------------------------------------------------------------------------------------------------------

|*  1 |  CONNECT BY WITH FILTERING|      |      1 |        |     14 |00:00:00.01 |      35 |  9216 |  9216 | 8192  (0)|

|*  2 |   FILTER                  |      |      1 |        |      1 |00:00:00.01 |       7 |       |    |             |

|   3 |    TABLE ACCESS FULL      | EMP  |      1 |     14 |     14 |00:00:00.01 |       7 |       |    |             |

|*  4 |   HASH JOIN               |      |      4 |        |     13 |00:00:00.01 |      28 |  1036K|  1036K|  776K (0)|

|   5 |    CONNECT BY PUMP        |      |      4 |        |     14 |00:00:00.01 |       0 |       |    |             |

|   6 |    TABLE ACCESS FULL      | EMP  |      4 |     14 |     56 |00:00:00.01 |      28 |       |    |             |

|   7 |   TABLE ACCESS FULL       | EMP  |      0 |     14 |      0 |00:00:00.01 |       0 |       |    |             |

-----------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

   1 - filter("ENAME"='KING')

   2 - filter("ENAME"='KING')

   4 - access("MGR"=NULL)



SQL> --level=2

SQL> select e.empno, e.ename, e.mgr, e.deptno,level

      from emp e

     start with ename = 'JONES'

    connect by prior empno = mgr;

     EMPNO ENAME             MGR     DEPTNO      LEVEL

---------- ---------- ---------- ---------- ----------

      7566 JONES            7839         20          1

      7788 SCOTT            7566         20          2

      7876 ADAMS            7788         20          3

      7902 FORD             7566         20          2

      7369 SMITH            7902         20          3

SQL> select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));

PLAN_TABLE_OUTPUT

------------------------------------------------------------------------------------------------------------------------

SQL_ID  2bcjwvmbyg7a5, child number 1

-------------------------------------

select e.empno, e.ename, e.mgr, e.deptno,level   from emp e  start with ename = 'JONES' connect by prior empno

= mgr

Plan hash value: 3364448299

-----------------------------------------------------------------------------------------------------------------------

| Id  | Operation                 | Name | Starts | E-Rows | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |

-----------------------------------------------------------------------------------------------------------------------

|*  1 |  CONNECT BY WITH FILTERING|      |      1 |        |      5 |00:00:00.01 |      28 |  9216 |  9216 | 8192  (0)|

|*  2 |   FILTER                  |      |      1 |        |      1 |00:00:00.01 |       7 |       |    |             |

|   3 |    TABLE ACCESS FULL      | EMP  |      1 |     14 |     14 |00:00:00.01 |       7 |       |    |             |

|*  4 |   HASH JOIN               |      |      3 |        |      4 |00:00:00.01 |      21 |  1036K|  1036K|  404K (0)|

|   5 |    CONNECT BY PUMP        |      |      3 |        |      5 |00:00:00.01 |       0 |       |    |             |

|   6 |    TABLE ACCESS FULL      | EMP  |      3 |     14 |     42 |00:00:00.01 |      21 |       |    |             |

|   7 |   TABLE ACCESS FULL       | EMP  |      0 |     14 |      0 |00:00:00.01 |       0 |       |    |             |

-----------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

   1 - filter("ENAME"='JONES')

   2 - filter("ENAME"='JONES')

   4 - access("MGR"=NULL)



SQL> --level=3

SQL> select e.empno, e.ename, e.mgr, e.deptno,level

      from emp e

     start with ename = 'SCOTT'

    connect by prior empno = mgr;

     EMPNO ENAME             MGR     DEPTNO      LEVEL

---------- ---------- ---------- ---------- ----------

      7788 SCOTT            7566         20          1

      7876 ADAMS            7788         20          2



SQL> select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));



PLAN_TABLE_OUTPUT

-----------------------------------------------------------------------------------------------------------------------

SQL_ID  fqf7r75c9atqv, child number 0

-------------------------------------

select e.empno, e.ename, e.mgr, e.deptno,level   from emp e  start with ename = 'SCOTT' connect by prior empno

= mgr

Plan hash value: 3364448299

-----------------------------------------------------------------------------------------------------------------------

| Id  | Operation                 | Name | Starts | E-Rows | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |

-----------------------------------------------------------------------------------------------------------------------

|*  1 |  CONNECT BY WITH FILTERING|      |      1 |        |      2 |00:00:00.01 |      21 |  9216 |  9216 | 8192  (0)|

|*  2 |   FILTER                  |      |      1 |        |      1 |00:00:00.01 |       7 |       |    |             |

|   3 |    TABLE ACCESS FULL      | EMP  |      1 |     14 |     14 |00:00:00.01 |       7 |       |    |             |

|*  4 |   HASH JOIN               |      |      2 |        |      1 |00:00:00.01 |      14 |  1036K|  1036K|  282K (0)|

|   5 |    CONNECT BY PUMP        |      |      2 |        |      2 |00:00:00.01 |       0 |       |    |             |

|   6 |    TABLE ACCESS FULL      | EMP  |      2 |     14 |     28 |00:00:00.01 |      14 |       |    |             |

|   7 |   TABLE ACCESS FULL       | EMP  |      0 |     14 |      0 |00:00:00.01 |       0 |       |    |             |

-----------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

   1 - filter("ENAME"='SCOTT')

   2 - filter("ENAME"='SCOTT')

   4 - access("MGR"=NULL)

SQL> --level=4

SQL> select e.empno, e.ename, e.mgr, e.deptno,level

      from emp e

     start with ename = 'SMITH'

    connect by prior empno = mgr;

     EMPNO ENAME             MGR     DEPTNO      LEVEL

---------- ---------- ---------- ---------- ----------

      7369 SMITH            7902         20          1



SQL> select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));

PLAN_TABLE_OUTPUT

-----------------------------------------------------------------------------------------------------------------------

SQL_ID  f5fvjuk1j8mak, child number 1

-------------------------------------

select e.empno, e.ename, e.mgr, e.deptno,level   from emp e  start with ename = 'SMITH' connect by prior empno

= mgr

Plan hash value: 3364448299

-----------------------------------------------------------------------------------------------------------------------

| Id  | Operation                 | Name | Starts | E-Rows | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |

-----------------------------------------------------------------------------------------------------------------------

|*  1 |  CONNECT BY WITH FILTERING|      |      1 |        |      1 |00:00:00.01 |      14 |  9216 |  9216 | 8192  (0)|

|*  2 |   FILTER                  |      |      1 |        |      1 |00:00:00.01 |       7 |       |    |             |

|   3 |    TABLE ACCESS FULL      | EMP  |      1 |     14 |     14 |00:00:00.01 |       7 |       |    |             |

|*  4 |   HASH JOIN               |      |      1 |        |      0 |00:00:00.01 |       7 |  1036K|  1036K|  318K (0)|

|   5 |    CONNECT BY PUMP        |      |      1 |        |      1 |00:00:00.01 |       0 |       |    |             |

|   6 |    TABLE ACCESS FULL      | EMP  |      1 |     14 |     14 |00:00:00.01 |       7 |       |    |             |

|   7 |   TABLE ACCESS FULL       | EMP  |      0 |     14 |      0 |00:00:00.01 |       0 |       |    |             |

-----------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

   1 - filter("ENAME"='SMITH')

   2 - filter("ENAME"='SMITH')

   4 - access("MGR"=NULL)

Oracle递归查询的原理的更多相关文章

  1. 【转载】Oracle递归查询:使用prior实现树操作【本文出自叶德华博客】

    本文标题:Oracle递归查询:使用prior实现树操作 本文链接:http://yedward.net/?id=41 本文版权归作者所有,欢迎转载,转载请以文字链接的形式注明文章出处. Oracle ...

  2. 【2016-11-7】【坚持学习】【Day22】【Oracle 递归查询】

    直接在oracle 递归查询语句 select * from groups start with id=:DeptId connect by prior superiorid =id 往下找 sele ...

  3. [转帖]万字详解Oracle架构、原理、进程,学会世间再无复杂架构

    万字详解Oracle架构.原理.进程,学会世间再无复杂架构 http://www.itpub.net/2019/04/24/1694/ 里面的图特别好 数据和云 2019-04-24 09:11:59 ...

  4. Oracle递归查询start with connect by prior

    一.基本语法 connect by递归查询基本语法是: select 1 from 表格 start with ... connect by prior id = pId start with:表示以 ...

  5. Oracle递归查询,Oracle START WITH……CONNECT BY查询

    Oracle递归查询,Oracle START WITH……CONNECT BY查询,Oracle树查询 ================================ ©Copyright 蕃薯耀 ...

  6. Oracle Golden Gate原理简介

    Oracle Golden Gate原理简介 http://www.askoracle.org/oracle/HighAvailability/20140109953.html#6545406-tsi ...

  7. Oracle特殊恢复原理与实战(DSI系列)

    1.深入浅出Oracle(DSI系列Ⅰ) 2.Oracle特殊恢复原理与实战(DSI系列Ⅱ) 3.Oracle SQL Tuning(DSI系列Ⅲ)即将开设 4.Oracle DB Performan ...

  8. Oracle Shared Pool 原理

    Oracle Shared Pool 原理 由于shared pool中最重要的是library cache,所以本文主要讲解Library cache的结构,library cache latch, ...

  9. Oracle递归查询与常用分析函数

    最近学习oracle的一些知识,发现自己sql还是很薄弱,需要继续学习,现在总结一下哈. (1)oracle递归查询  start with ... connect by prior ,至于是否向上查 ...

随机推荐

  1. 大数据学习——本地安装redis

    下载安装包 https://github.com/MicrosoftArchive/redis 下载后解压 运行cmd 然后到redis路径 运行命令: redis-server redis.wind ...

  2. 原 jmeter中类似lr的场景设置

    有一天如果你们领导来一句给我测下这个首页到底能扛多少并发,并发量极限是多少,这时你不要慌不要忙,拿出jmeter神器,设置下场景,目标设置成1000,每10秒启动100个并发,等着看什么时候系统响应开 ...

  3. mongodb权限机制以及扩展

    mongodb权限机制 启动权限机制之前要先在MONGODB中添加管理员账号: 1. 创建账号 重装安装一个mongodb,安装时添加一个 --auth参数: 先把安装好的从服务中删除掉(删除之后数据 ...

  4. xmpp 登录注册小结

    将XMPPStream放在APPDelegate,以便全局访问 #pragma mark - XMPP相关的属性和方法定义 /** * 全局xmppstream,只读属性 */ @property ( ...

  5. 【Luogu】P3380树套树模板(线段树套Splay)

    题目链接 幸甚至哉,歌以咏志. 拿下了曾经是那么遥不可及的线段树,学会了曾经高不可攀的平衡树,弄懂了装B的时候才挂在嘴边的树套树. 每道模板都是链上的一颗珠子.把它们挨个串起来,就成为我成长的历程. ...

  6. HDU——1059Dividing(母函数或多重背包)

    Dividing Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  7. BZOJ 4037 [HAOI2015]数字串拆分 ——动态规划

    拆分的情况下,发现f数组本身并不是很好递推. 因为f(123)=f(123)/f(12+3)/f(1+2+3). 然后考虑f可以怎么表示f(n)=a0*M^n M为转移矩阵. 然后发现 f(x+y)= ...

  8. bzoj2748 [HAOI2012]音量调节 背包

    Description 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都要改变一次音量.在演出开始之前,他已经做好了一个列表,里面写着在每首歌开始之前他想要改 ...

  9. Linux(12):期中架构(4)--- 前端部分:HTTP & Nginx & LNMP架构

    HTTP协议概念原理说明 1. 当用户访问一个网站时经历的过程 # ①. 利用DNS服务,将输入的域名解析为相应的IP地址 a 本地主机输入域名后,会查询本地缓存信息和本地hosts b 本地主机会向 ...

  10. N*N数码问题

    奇数码问题 时间限制: 1 Sec  内存限制: 128 MB 题目描述 你一定玩过八数码游戏,它实际上是在一个3*3的网格中进行的,1个空格和1~8这8个数字恰好不重不漏地分布在这3*3的网格中. ...