在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. SPOJ-Grid ,水广搜easy bfs

    SERGRID - Grid 一个水广搜我竟然纠结了这么久,三天不练手生啊,况且我快三个月没练过搜索了... 题意:n*m的方格,每个格子有一个数,意味着在此方格上你可以上下左右移动s[x][y]个格 ...

  2. 【Luogu】P1462通往奥格瑞玛的道路(二分答案+SPFA)

    题目链接 导致我WA十几遍的原因居然是最大值不够大……以后再也不相信memset(dis,127/3,sizeof(dis))了. 此题先将花费排序,然后二分最大花费,spfa判断解是否可行.spfa ...

  3. Spring-IOC源码解读3-依赖注入

    当容器已经载入了BeanDefinition的信息完成了初始化,我们继续分析依赖注入的原理,需要注意的是依赖注入是用户第一次向IOC容器获取Bean的时候发生的,这里有个例外,那就是如果用户在Bean ...

  4. 洛谷 P 1119 灾后重建

    题目背景 B地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响.但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车.换句话说,只有连接着两个重建完成的村庄的公路才能 ...

  5. BZOJ4726: [POI2017]Sabota?

    $n \leq 500000$的树,开始有一个点是坏的,如果一个子树中坏点比例(不包括根节点)超过x那这整棵子树就会变坏,问最坏情况下不超过$K$个坏点的情况下$x$最小是多少. 被坑成傻逼.. 可以 ...

  6. Scott Mitchell的ASP.NET2.0数据指南中文版索引

    原文发布时间为:2008-08-03 -- 来源于本人的百度文章 [由搬家工具导入] 原文http://www.cnblogs.com/ilovejolly/archive/2006/10/05/52 ...

  7. Struts2标签-checkbox只读属性设置

    Struts2标签-checkbox只读属性设置 在struts2的checkbox标签中,为实现只读效果,一般使用readonly="true"是达不到效果的,但设置disabl ...

  8. [转发]Android 系统稳定性 - ANR(一)

    文章都为原创,转载请注明出处,未经允许而盗用者追究法律责任.很久之前写的了,留着有点浪费,共享之.编写者:李文栋  http://rayleeya.iteye.com/blog/1955652 如果你 ...

  9. python3.6安装遇到的问题

    Ubuntu16.04版本最新的Python 3.x版本3.5 . 可以从源代码执行安装最新稳定版本3.6. 要安装Python 3.6 ,请运行以下命令: # wget https://www.py ...

  10. (44)C#网络2

    一.用SmtpClient类发送邮件 允许应用程序使用简单邮件传输协议 (SMTP) 发送电子邮件 using System.Net.Mail; SmtpClient smtpClient = new ...