列定义允许null,可能导致Index Hint提升不走索引
2009-12-02 17:09
274 查看
遇到一个SB问题,加index hint提升,居然也不走索引,郁闷良久,结果发现该表的定义允许null,这对优化器有影响
SQL> desc emp
名称 是否为空? 类型
----------------------------------------------------------------------------------------------------------------- -------- --------------
EMPNO NOT NULL NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)
我在ename上建立了一个index
SQL> select table_name, index_name,column_name from user_ind_columns;
TABLE_NAME INDEX_NAME COLUMN_NAME
------------------------------ ------------------------------ -----------------
DEPT PK_DEPT DEPTNO
EMP PK_EMP EMPNO
EMP EMA_ENAME ENAME
SQL> select dbms_metadata.get_ddl('INDEX','EMA_ENAME','SCOTT') FROM DUAL;
DBMS_METADATA.GET_DDL('INDEX','EMA_ENAME','SCOTT')
--------------------------------------------------------------------------------
CREATE INDEX "SCOTT"."EMA_ENAME" ON "SCOTT"."EMP" ("ENAME")
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "USERS"
SQL> select /*+ index(emp.ename) */ ename from emp;
已选择14行。
执行计划
----------------------------------------------------------
Plan hash value: 3956160932
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 14 | 84 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| EMP | 14 | 84 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------
可以看见即使提升了优化器走索引,结果优化器也不走
SQL> alter table emp modify ename not null;
表已更改。
SQL> select /*+ index(emp.ename) */ ename from emp ;
已选择14行。
执行计划
----------------------------------------------------------
Plan hash value: 1224545206
------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 14 | 84 | 1 (0)| 00:00:01 |
| 1 | INDEX FULL SCAN | EMA_ENAME | 14 | 84 | 1 (0)| 00:00:01 |
------------------------------------------------------------------------------
现在将列定义为非null,用hint提升优化器就走了索引了。
SQL> desc emp
名称 是否为空? 类型
----------------------------------------------------------------------------------------------------------------- -------- --------------
EMPNO NOT NULL NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)
我在ename上建立了一个index
SQL> select table_name, index_name,column_name from user_ind_columns;
TABLE_NAME INDEX_NAME COLUMN_NAME
------------------------------ ------------------------------ -----------------
DEPT PK_DEPT DEPTNO
EMP PK_EMP EMPNO
EMP EMA_ENAME ENAME
SQL> select dbms_metadata.get_ddl('INDEX','EMA_ENAME','SCOTT') FROM DUAL;
DBMS_METADATA.GET_DDL('INDEX','EMA_ENAME','SCOTT')
--------------------------------------------------------------------------------
CREATE INDEX "SCOTT"."EMA_ENAME" ON "SCOTT"."EMP" ("ENAME")
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "USERS"
SQL> select /*+ index(emp.ename) */ ename from emp;
已选择14行。
执行计划
----------------------------------------------------------
Plan hash value: 3956160932
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 14 | 84 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| EMP | 14 | 84 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------
可以看见即使提升了优化器走索引,结果优化器也不走
SQL> alter table emp modify ename not null;
表已更改。
SQL> select /*+ index(emp.ename) */ ename from emp ;
已选择14行。
执行计划
----------------------------------------------------------
Plan hash value: 1224545206
------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 14 | 84 | 1 (0)| 00:00:01 |
| 1 | INDEX FULL SCAN | EMA_ENAME | 14 | 84 | 1 (0)| 00:00:01 |
------------------------------------------------------------------------------
现在将列定义为非null,用hint提升优化器就走了索引了。
相关文章推荐
- 列定义允许null,可能导致Index Hint提升不走索引
- 类型转换导致执行计划不走索引测试案例
- c# MVC Index页面可能导致的问题——概括一下。tIAO
- Oracle直方图导致SQL不走索引.
- Oracle Hint(提示)和INDEX(索引)的一些忠告
- 数据类型不一致导致的SQL不走索引
- 索引Hint提示(INDEX Hint)
- Oracle Hint(提示)和INDEX(索引)的一些忠告
- 数值转换导致不走索引
- 浅谈自定义头文件可能导致的重定义问题
- 11g 搜集直方图导致不走索引
- 可能导致index unusable的维护操作
- ALTER TABLE 只允许添加满足下述条件的列: 列可以包含 Null 值;或者列具有指定的 DEFAULT 定义;或者要添加的列是标识列或时间戳列;或者,如果前几个条件均未满足,则表必须为空以允
- SQL SERVER 中is null 和 is not null 将会导致索引失效吗?
- SQL Server [索引] -- SQL SERVER 中is null 和 is not null 将会导致索引失效吗?
- SQL Server ->> 关于究竟ALTER INDEX ... REBUILD会不会导致改变索引选项和Filegroup的验证
- oracle hint 强制索引 /*+INDEX(TABLE INDEX_NAME)*/ 注意别名
- mysql,sql server,oracle 唯一索引字段是否允许出现多个 null 值?
- Mysql优化,导致查询不走索引的原因总结
- 不允许对索引显式地使用 DROP INDEX,该索引正用于 UNIQUE KEY