关于null影响索引使用的一例子
2014-04-06 11:48
363 查看
测试表:
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 为空的行给漏了,但既然都为空,也就没东西展示了,按理也可以直接使用索引才对呢.
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++代码实现—— 中缀表达式的计算
- 火狐调试flex注册js报错问题
- [初探Cocos2d-x]之CCMenuItem菜单类
- 观察者模式理解
- c#让窗体永在最前 调用windows api 将窗体设为topmost
- apue和unp的学习之旅05——包裹函数
- java基础07
- 【JAVA学习】java中==、equals()、hashCode()都和对象的比较有关,在java中这三者各有什么用处呢,即java中为什么需要设计这三种对象的比较方法呢?
- apt-get update message---------what do Ign Error Hit Get&nbsp
- 新的开始
- JSTL 核心标签库 使用
- 在ubuntu下手机无法挂载的问题
- [贪心]UVA10720 - Graph Construction
- Cocopods安装和使用
- Win8.1自带的微软拼音输入法卡顿打不出字的解决方法
- win8.1系统网速慢的原因及加快网速的几种方法
- 1_Linux基础知识及命令――――登陆登出及图形化界面的初始化
- 系统时钟
- .net 开发技术 + 棋王竞猜游戏娱乐网站(www.51qiwang.com)
- ubuntu 13.10 64 安装subclipse