zoukankan      html  css  js  c++  java
  • 转:oracle树形查询是否会全表扫描?答案:不会

    oracle树形查询一定会全表扫描吗?
    比如有这样的表,id是主键,parent_id列有索引,查询条件是:
      start with id='xxx'
        connect by parent_id= prior id

    表有一百万行,查出的结果集只有几十行,按理说应该很快才对(nested loop),即使写程序来循环也很快,但Oracle似乎总是会全表扫描,导致很慢?

    我做了个测试,会用到索引:

    CREATE TABLE TEST
    AS
    SELECT ROWNUM id, ROWNUM-1 parent_id FROM DUAL CONNECT BY ROWNUM<=1E6;

    ALTER TABLE TEST ADD CONSTRAINT test_pk PRIMARY KEY (ID);

    CREATE INDEX TEST_X ON TEST(PARENT_ID);

    SELECT * FROM TEST START WITH ID=1E6-50 CONNECT BY PARENT_ID = PRIOR ID;

    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 3690598434

    -----------------------------------------------------------------------------------------
    | Id  | Operation                     | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
    -----------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT              |         |     2 |    52 |    11  (19)| 00:00:01 |
    |*  1 |  CONNECT BY WITH FILTERING    |         |       |       |            |          |
    |   2 |   TABLE ACCESS BY INDEX ROWID | TEST    |     1 |    26 |     3   (0)| 00:00:01 |
    |*  3 |    INDEX UNIQUE SCAN          | TEST_PK |     1 |       |     2   (0)| 00:00:01 |
    |   4 |   NESTED LOOPS                |         |     1 |    39 |     6   (0)| 00:00:01 |
    |   5 |    CONNECT BY PUMP            |         |       |       |            |          |
    |   6 |    TABLE ACCESS BY INDEX ROWID| TEST    |     1 |    26 |     3   (0)| 00:00:01 |
    |*  7 |     INDEX RANGE SCAN          | TEST_X  |     1 |       |     2   (0)| 00:00:01 |
    -----------------------------------------------------------------------------------------

    Predicate Information (identified by operation id):
    ---------------------------------------------------

       1 - access("TEST"."PARENT_ID"=PRIOR "TEST"."ID")
       3 - access("ID"=999950)
       7 - access("PARENT_ID"="connect$_by$_pump$_002"."PRIOR ID")

    Note
    -----
       - dynamic sampling used for this statement (level=2)
     

    魔兽就是毒瘤,大家千万不要玩。
  • 相关阅读:
    LeetCode——字符串解码
    LeetCode——迷宫 i-ii
    JavaScript实现按照指定长度为数字前面补零输出的方法
    React 修改input按钮上文字
    HTML input可以输入相同的文件
    LeetCode——重新安排行程
    LeetCode——矩阵中的最长递增路径
    c++ vector push_back对象的时候存起来的是拷贝
    char* = "name" g++报告warn的原因
    虚函数表指针、父类成员变量、子类成员变量在内存中的位置关系
  • 原文地址:https://www.cnblogs.com/tracy/p/1785088.html
Copyright © 2011-2022 走看看