oracle索引的监控

author:skate
time :2009/08/21

 

最近的研究发现 Oracle 数据库所使用的索引从来没有达到过可用索引数的1/4,

 

或者其用法与其开始设计的意图不相同。未用的索引浪费空间,而且还会降低 DML

 

的速度,尤其是 UPDATE 和 INSERT 语句;控数据库索引的使用,释放那些未被使用

 

的索引,从而节省维护索引的开销,优化sql性能

 


在 Oracle9i 之前,监控索引使用的唯一方法是执行他们的程序库缓中的所有SQL,

 

然后手工记下所有被使用的索引。

 

 

oracle9i中如何确定索引的使用情况


 在oracle9i中,情况会简单的多,因为有一个新的字典视图V$SQL_PLAN存储了实际计划,

 

  这些计划用于执行共享SQL区中得语句。V$SQL_PLAN视图很类似与计划表,但V$SQL_PLAN
 
  使用ADDRESS和HASH_VALUE列 来识别语句, 而计划表使用用户提供得STATEMENT_ID来识
 
  别语句。下面的SQL显示了在一个oracle9i数据库中,由出现在共享SQL区中语句使用的所
 
  有索引


 select object_owner, object_name, options, count(*)
  from  v$sql_plan
   where operation='INDEX'
  and  object_owner!='SYS'
  group by object_owner, object_name, operation, options
  order by count(*) desc;

  
  所有基于共享SQL区中的信息来识别索引使用情况的方法, 都可能会收集到不完整的信息。共享SQL区是
   
    一个动态结构,除非能对它进行足够频繁的采样, 否则在有关索引使用的情况的信息被收集之前,SQL语
   
    句可能就已经(因为老化)被移出缓存了。

 


    Oracle9i提供一个简单的方法来打开和关闭索引使用跟踪,那就是MONITORING USAGE 子句:

 

  alter index cust_name_idx monitoring usage;
  alter index cust_name_idx nomonitoring usage;

 

  这个命令使用V$OBJECT_USAGE 视图和 USAGE 字段来判断索引是否被访问过。你可能期望 USAGE 字段是一个数字值,

 

    这样你就可以知道索引被使用的次数,但不幸的是,它的取值只为YES 或NO。但不管怎样,如果你接手一个以前开发
   
    的数据库,而且老数据库在没有考虑到 SQL 访问表的情况下创建了索引,那么这个工具对你是很有用的。INDEX MONITORING
   
    特性的开销非常小,而对定位和丢弃不需要的索引很有帮助

 

打开整个方案的索引监控的简单 SQL*Plus 脚本

    set pages 999
  set heading off
  spool run_mon.sql
  select
    'alter index '||
    index_name||
    ' monitoring usage;'
  from
    dba_indexes
  where
    owner = 'HPO5';
  spool off


 sql> @run_mon

 

oracle索引监控周期的选择,一般要覆盖对数据库所有的操作,避免漏掉

 

------end-----

 

 

你可能感兴趣的:(oracle,sql,数据库,object,脚本,insert)