那么当统计信息过久的时候通常使用dbms_stats包进行相应对象信息的收集。
第五种:使用通配符查询:
当谓词条件中存在%或是_通配符的时候,oracle会忽略索引,但是可以通过通配符位移解决,如下:
SQL> create index emp_idx2 on emp(ename);
Index created.
SQL> set autotrace trace exp
SQL> select * from emp where ename like '%OT%';
Execution Plan
----------------------------------------------------------
Plan hash value: 822536733
--------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
--------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 38 | 14 (0)| 00:00:01 | | |
| 1 | PARTITION RANGE ALL| | 1 | 38 | 14 (0)| 00:00:01 | 1 | 4 |
|* 2 | TABLE ACCESS FULL | EMP | 1 | 38 | 14 (0)| 00:00:01 | 1 | 4 |
--------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("ENAME" LIKE '%OT%')
SQL> SELECT * FROM EMP WHERE ENAME LIKE 'SC%OT%';
Execution Plan
----------------------------------------------------------
Plan hash value: 547783664
---------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
---------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 38 | 2 (0)| 00:00:01 | | |
| 1 | TABLE ACCESS BY GLOBAL INDEX ROWID| EMP | 1 | 38 | 2 (0)| 00:00:01 | ROWID | ROWID |
|* 2 | INDEX RANGE SCAN | EMP_IDX2 | 1 | | 1 (0)| 00:00:01 | | |
---------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("ENAME" LIKE 'SC%OT%')
filter("ENAME" LIKE 'SC%OT%')
SQL>
第六种:在谓词条件中存在函数
无论在谓词中存在隐式函数转换或是显示函数那么oracle都不会使用索引,对于隐式函数转换例子如下:
http://blog.csdn.net/rhys_oracle/article/details/18011077
第七种:谓词列存在null值。
当在谓词条件中的列存在null值,那么oracle将跳过索引,因为null值不存在索引段中,但是如果是复合索引,其中一列为null,另外一列不为null,那么数据库依然使用索引。
第八种:跳过前导列
这是最后一种不使用索引的原因,那就是如果是在默写列上创建了复合索引,但在谓词条件中没有涉及到前导列,那么将会是跳过索引。