zoukankan      html  css  js  c++  java
  • 关于null影响索引使用的一例子

    测试表:

    create table products(prod_id number(10), prod_name varchar(20));

    create index idx_products_1 on products(upper(prod_name));

    SQL> select  upper(prod_name) from products a ;

    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 1954719464

    ------------------------------------------------------------------------------
    | Id  | Operation         | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
    ------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |          |   101 |  1212 |     3   (0)| 00:00:01 |
    |   1 |  TABLE ACCESS FULL| PRODUCTS |   101 |  1212 |     3   (0)| 00:00:01 |
    ------------------------------------------------------------------------------

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

    --使用hint 强制使用索引也同样无效

    SQL> select /*+index(a IDX_PRODUCTS_1)*/  upper(prod_name) from products a;

    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 1954719464

    ------------------------------------------------------------------------------
    | Id  | Operation         | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
    ------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |          |   101 |  1212 |     3   (0)| 00:00:01 |
    |   1 |  TABLE ACCESS FULL| PRODUCTS |   101 |  1212 |     3   (0)| 00:00:01 |
    ------------------------------------------------------------------------------

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

    --加入条件 not null 后正常使用索引扫描

    SQL> select  upper(prod_name) from products a where upper(prod_name) is not null;

    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 3690238772

    -----------------------------------------------------------------------------------
    | Id  | Operation        | Name           | Rows  | Bytes | Cost (%CPU)| Time     |
    -----------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT |                |     5 |    60 |     1   (0)| 00:00:01 |
    |*  1 |  INDEX FULL SCAN | IDX_PRODUCTS_1 |     5 |    60 |     1   (0)| 00:00:01 |
    -----------------------------------------------------------------------------------

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

       1 - filter(UPPER("PROD_NAME") IS NOT NULL)

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

    --修改表prod_name 字段为非空后同样可使用索引

    SQL> alter table products modify prod_name not null;

    Table altered.

    SQL> select  upper(prod_name) from products a ;

    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 3690238772

    -----------------------------------------------------------------------------------
    | Id  | Operation        | Name           | Rows  | Bytes | Cost (%CPU)| Time     |
    -----------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT |                |   101 |  1212 |     1   (0)| 00:00:01 |
    |   1 |  INDEX FULL SCAN | IDX_PRODUCTS_1 |   101 |  1212 |     1   (0)| 00:00:01 |
    -----------------------------------------------------------------------------------

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

    oracle这样做只是为了避免将prod_name 为空的行给漏了,但既然都为空,也就没东西展示了,按理也可以直接使用索引才对呢.

  • 相关阅读:
    包含源文件 —— 是奇技淫巧还是饮鸩止渴?
    感谢各位网友——《品悟C——抛弃 C程序设计 中的谬误与恶习》正式出版
    能否用痰盂盛饭——谈谈在头文件中定义外部变量
    C:劣书简易鉴别法
    从“站在巨人的肩上”到“跪到侏儒之脚下”——图灵公司副主编自供(二)
    劣质代码评析——刻舟求剑的故事
    Python自然语言处理学习笔记(36): 4.8 Python库的样本
    Python自然语言处理学习笔记(38): 4.10 深入阅读
    Python自然语言处理学习笔记(37):4.9 小结
    Python自然语言处理学习笔记(35): 4.7 算法设计
  • 原文地址:https://www.cnblogs.com/bowshy/p/3648364.html
Copyright © 2011-2022 走看看