如何让ORACLE索引不可见(2)
|* 2 | TABLE ACCESS FULL | T1 | 2 | 34 | 23 (22)|
-------------------------------------------------------------------------
这样索引就隐藏起来了,如果把索引隐藏后发现有性能问题,我们可以立即打开索引:
SQL> alter index IDX_T1_TABLE_NAME visible;
Index altered
SQL> explain plan for select count(*) from t1 where table_name=T1;
Explained
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3098159
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Tim
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 17 | 1 (0)| 00:
| 1 | SORT AGGREGATE | | 1 | 17 | |
|* 2 | INDEX RANGE SCAN| IDX_T1_TABLE_NAME | 1 | 17 | 1 (0)| 00:
--------------------------------------------------------------------------------
以上是Oracle11g的处理方法,但是在Oracle9i或Oracle10g中索引没有invisible的功能,我们如何处理呢?
现在Oracle数据库一般都采用基于成本的计算方法来生成执行计划,只要索引的成本更低,ORACLE就会选择使用索引,OK,那我们只要告诉ORACLE使用这个索引成本很高,它就不会使用这个索引,这样就达到了暂时让索引不可用的效果。相信很多人都知道ORACLE提供了dbms_stats包来管理对像的统计信息,通过dbms_stats.set_index_stats函数我们可以强制设置统计信息,现在我们只要把索引的成本设置成非常大即可,如下所示:
--查看IDX_T1_TABLE_NAME的基本统计信息
SQL> select a.owner,a.index_name,a.blevel,a.leaf_blocks,a.num_rows from all_indexes a where owner=YZS and index_name=IDX_T1_TABLE_NAME;
OWNER INDEX_NAME BLEVEL LEAF_BLOCKS NUM_ROWS
------------------------------ ------------------------------ ---------- ----------- ----------
相关新闻>>
- 发表评论
-
- 最新评论 更多>>