zoukankan      html  css  js  c++  java
  • 类型转换导致运行计划不走索引測试案例


    測试环境模拟:
    SQL> drop table t_col_type purge;
    create table t_col_type(id varchar2(20),col2 varchar2(20),col3 varchar2(20));
    insert into t_col_type select rownum,'abc','efg' from dual connect by level<=10000;
    commit;
    create index idx_id on t_col_type(id);
    set linesize 1000
    set autotrace traceonlydrop table t_col_type purge
               *
    ERROR at line 1:
    ORA-00942: table or view does not exist


    SQL> select * from t_col_type where id=6;


    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 3191204463

    --------------------------------------------------------------------------------
    | Id  | Operation                                  | Name             | Rows  | Bytes | Cost (%CPU)| Time     |
    --------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT              |                        |     1    |    36 |     8   (0)| 00:00:01 |
    |*  1 |  TABLE ACCESS FULL            | T_COL_TYPE |     1    |    36 |     8   (0)| 00:00:01 |
    --------------------------------------------------------------------------------

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

       1 - filter(TO_NUMBER("ID")=6)

    Note
    -----
       - dynamic sampling used for this statement


    Statistics
    ----------------------------------------------------------
              5  recursive calls
              0  db block gets
             64  consistent gets
              0  physical reads
              0  redo size
            640  bytes sent via SQL*Net to client
            469  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              0  sorts (memory)
              0  sorts (disk)
              1  rows processed


    这里好像有点奇怪啊。明明建了index [create index idx_id on t_col_type(id);]可是为啥没实用到呢?

    ---查看表上列是否有索引
    SQL> select index_name , table_name,column_name from all_ind_columns where table_name ='T_COL_TYPE';

    INDEX_NAME
    ------------------------------------------------------------
    TABLE_NAME
    ------------------------------------------------------------
    COLUMN_NAME
    --------------------------------------------------------------------------------
    IDX_ID
    T_COL_TYPE
    ID


    ----查看表结构
    SQL> desc scott.T_COL_TYPE
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     ID                                                 VARCHAR2(20)----------注意这里的字符类型
     COL2                                               VARCHAR2(20)
     COL3                                               VARCHAR2(20)


    再次关注下 运行计划中的谓语信息:
    1 - filter(TO_NUMBER("ID")=6)  ----------这里发生了类型转换

    所以在运行计划中就无法用已有的索引,那么怎样才干让他正确走索引呢?

    select * from t_col_type where id='6';------注意下这里的差别加了单引號,表明这是个字符。


    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 3998173245

    ------------------------------------------------------------------------------------------
    | Id  | Operation                   | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
    ------------------------------------------------------------------------------------------
    |   0 |  SELECT STATEMENT                         |                       |     1 |    36 |     2   (0)| 00:00:01 |
    |   1 |  TABLE ACCESS BY INDEX ROWID   | T_COL_TYPE |     1 |    36 |     2   (0)| 00:00:01 |
    |*  2 |              INDEX RANGE SCAN             | IDX_ID              |     1 |       |     1   (0)| 00:00:01 |
    ------------------------------------------------------------------------------------------

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

       2 - access("ID"='6')

    Note
    -----
       - dynamic sampling used for this statement


    Statistics
    ----------------------------------------------------------
              9  recursive calls
              0  db block gets
             39  consistent gets
              1  physical reads
              0  redo size
            640  bytes sent via SQL*Net to client
            469  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              0  sorts (memory)
              0  sorts (disk)
              1  rows processed


     

  • 相关阅读:
    HDU 5451 Best Solver(fibonacci)
    BestCoder Round #56 1002 Clarke and problem 1003 Clarke and puzzle (dp,二维bit或线段树)
    HDU
    Codeforces Round #320 (Div. 1) [Bayan Thanks-Round] C A Weakness and Poorness (三分)
    Codeforces Round #320 (Div. 1) [Bayan Thanks-Round] B "Or" Game (贪心)
    Codeforces Round #320 (Div. 1) [Bayan Thanks-Round] A A Problem about Polyline(数学)
    ZOJ 1729 Hidden Password (字符串最小表示)
    UVA 11627 Slalom(二分)
    UVALive 4254 Processor(二分)
    UVA 10905 Children's Game (贪心)
  • 原文地址:https://www.cnblogs.com/jhcelue/p/6868813.html
Copyright © 2011-2022 走看看