首页 > 其他 > 详细

关于null影响索引使用的一例子

时间:2014-04-06 16:52:35      阅读:344      评论:0      收藏:0      [点我收藏+]

测试表:

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 为空的行给漏了,但既然都为空,也就没东西展示了,按理也可以直接使用索引才对呢.

关于null影响索引使用的一例子,布布扣,bubuko.com

关于null影响索引使用的一例子

原文:http://www.cnblogs.com/bowshy/p/3648364.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!