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-----