oracle不使用索引的原因有哪些?(三)

2014-11-24 16:56:07 · 作者: · 浏览: 3
B-14 10.39.20.219977 PM -07:00 Oracle defined automatic moving window baseline st atistics computation job DRA_REeva lUATE_OPEN_FAILURES 31-JAN-14 06.00.02.807655 AM PST8PDT Reeva luate open failures for DRA HM_CREATE_OFFLINE_DICTIONARY Create offline dictionary in ADR for DRA name tran slation ORA$AUTOTASK_CLEAN 06-FEB-14 09.39.19.975070 PM PST8PDT Delete obsolete AUTOTASK repository data FILE_WATCHER File watcher job PURGE_LOG 06-FEB-14 09.39.19.999313 PM PST8PDT purge log job MGMT_STATS_CONFIG_JOB 06-FEB-14 10.39.19.607560 PM -07:00 OCM Statistics collection job. MGMT_CONFIG_JOB 07-FEB-14 01.01.01.661585 AM -07:00 Configuration collection job. RLM$SCHDNEGACTION 07-FEB-14 04.32.12.069752 PM +08:00 RLM$EVTCLEANUP 07-FEB-14 01.49.46.407904 AM -07:00 14 rows selected. SQL>


那么当统计信息过久的时候通常使用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,那么数据库依然使用索引。

第八种:跳过前导列

这是最后一种不使用索引的原因,那就是如果是在默写列上创建了复合索引,但在谓词条件中没有涉及到前导列,那么将会是跳过索引。