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)
     

    魔兽就是毒瘤,大家千万不要玩。
  • 相关阅读:
    金蝶软件常用基础SQL数据表
    改变cxgrid行字体颜色
    C#默认修饰符
    const和static
    怎么写动态游标
    Report Machine支持导出PDF
    C1TrueDBGrid注册码
    免费在线思维导图工具Mindv V1.1.0发布
    支持中文输入的免费的Silverlight Richtextbox
    云计算浅谈之一:云计算介绍
  • 原文地址:https://www.cnblogs.com/tracy/p/1785088.html
Copyright © 2011-2022 走看看