在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. 【02】markdown工具推荐

    [02]信息 Windows 平台 MarkdownPad MarkPad Linux 平台 ReText Mac 平台 Mou 最新版Mac OS下Mou已经无法使用了.这里推荐一个跨平台的编辑器  ...

  2. DDL、DML、DCL、DQL的理解

    DDL.DML 和 DCL 的理解 DDL(data definition language)数据库定义语言 的主要语句(操作) Create 语句:可以创建数据库和数据库的一些对象. Drop 语句 ...

  3. [android开发篇] api demo 官网学习网址

    http://www.android-doc.com/resources/samples/wifidirectdemo/index.html

  4. ORACLE查询字段中含有空格的数据

    SELECT * FROM T_NAME WHERE REGEXP_LIKE(COLNAME, '( )+'); SELECT * FROM T_NAME WHERE length(COLNAME) ...

  5. BZOJ 1297: [SCOI2009]迷路 [矩阵快速幂]

    Description windy在有向图中迷路了. 该有向图有 N 个节点,windy从节点 0 出发,他必须恰好在 T 时刻到达节点 N-1. 现在给出该有向图,你能告诉windy总共有多少种不同 ...

  6. 【单调队列】bzoj 1407 [HAOI2007]理想的正方形

    [题意] 给定一个n*m的矩阵,求所有大小为k*k的正方形中(最大值-最小值)的最小值 [思路] 先横着算出每一行的长度为k的窗口内的最大值,变成一个n*(m-k+1)的矩阵mx 再竖着算出每一列的长 ...

  7. hihocoder #1290 : Demo Day

    传送门 #1290 : Demo Day 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 You work as an intern at a robotics star ...

  8. PatentTips - Blending a Graphic over a Video

    Television broadcasts of events can be enhanced by providing graphics that are blended with other im ...

  9. R语言入门-画图(二)--heatmap

    一.函数参数: pheatmap参数: treeheight_row #横有多长 treeheight_col #竖有多长 cluster_cols=FLASE #单一方向聚类,也就是只有一边有树状结 ...

  10. Mongodb报错:ERROR: child process failed, exited with error number 1

    Mongodb在启动时报错: 2018-10-16T11:18:54.533+0800 I CONTROL [main] Automatically disabling TLS 1.0, to for ...