Oracle不使用索引的几种情况列举(4)

情况4:
考虑以下情况,已经对一个字符钱建立了索引。这个列只包含数据数据。如果使用以下语法来查询:
select * from t where indexed_colum=5;
注意查询中的数字5是常数5(而不是一个字符串),此时就没有使用INDEXED_COLUMN上的索引。这是因为,前面的查询等价于以下查询:
select * from t where to_number(indexed_column)=5;
我们对这个列隐式地应用了一个函数,如情况3所述,这就会禁止使用这个索引。
zx@ORCL>create table t2 (x char(1) constraint t2_pk primary key ,y date);
 
Table created.
 
zx@ORCL>insert into t2 values('5',sysdate);
 
1 row created.
 
zx@ORCL>commit;
 
Commit complete.
 
zx@ORCL>exec dbms_stats.gather_table_stats(USER,'T2',cascade=>true);
 
PL/SQL procedure successfully completed.
 
zx@ORCL>explain plan for select * from t2 where x=5;
 
Explained.
 
zx@ORCL>select * from table(dbms_xplan.display);
 
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 1513984157
 
--------------------------------------------------------------------------
| Id  | Operation        | Name | Rows  | Bytes | Cost (%CPU)| Time    |
--------------------------------------------------------------------------
|  0 | SELECT STATEMENT  |      |    1 |    12 |    3  (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| T2  |    1 |    12 |    3  (0)| 00:00:01 |
--------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
  1 - filter(TO_NUMBER("X")=5)
 
Note
-----
  - dynamic sampling used for this statement (level=2)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/ecf73e2dd65b578cb01dbf751a9d77f7.html