监控索引使用情况(去除无用索引)

一个系统,经过长期的运行、维护和版本更新后,可能会产生大量的索引,甚至索引所占空间远远大于数据所占的空间。很多索引,在初期设计时,对于系统来说是有用的。但是,经过系统的升级、数据表结构的调整、应用的改变,很多索引逐渐不被使用,成为了垃圾索引。这些索引占据了大量数据空间,增加了系统的维护量,甚至会降低系统性能。因此,DBA应该根据系统的变化,找出垃圾索引,为系统减肥。
Oracle 9i后,可以通过设置对索引进行监控,来监视索引在系统中是否被使用到。语法如下:

alter index <INDEX_NAME> monitoring usage;


如果需要取消监控,可以使用以下语句:

alter index <INDEX_NAME> nomonitoring usage;


设置监控后,就可以查询视图v$object_usage来确认该索引是否被使用。

以下是一个DEMO演示:

SQL> select * from v$object_usage;

INDEX_NAME                     TABLE_NAME                     MONITORING USED START_MONITORING    END_MONITORING
------------------------------ ------------------------------ ---------- ---- ------------------- -------------------

SQL> alter index QUEST_TEMPLATE_IDX monitoring usage;

Index altered

SQL> select count(*) from quest_template a
  2  where minlevel >=38
  3  and maxlevel <= 45;

  COUNT(*)
----------
       165

SQL> select * from v$object_usage;

INDEX_NAME                     TABLE_NAME                     MONITORING USED START_MONITORING    END_MONITORING
------------------------------ ------------------------------ ---------- ---- ------------------- -------------------
QUEST_TEMPLATE_IDX             QUEST_TEMPLATE                 YES        YES  05/22/2007 14:02:51

但是,这个方法可能存在一个问题:对于一个复杂系统来说,索引的数量可能是庞大的,那么我们如何来鉴定那些索引是值得怀疑的,应该被监控的呢?换句话说,我们如何减少监控范围呢?这里介绍几个方法。

1、利用library cache数据
在library cache中,存储了系统中游标的查询计划(并非全部,受library cache大小的限制),通过视图v$sql_plan,我们可以查询到这些数据。利用这些数据,我们可以排除那些出现在查询计划中的索引:


select a.object_owner, a.object_name
from v$sql_plan a, v$sqlarea b
where a.sql_id = b.sql_id
and a.object_type='INDEX'
and b.last_load_time > <START_AUDIT_DATE>;

2、利用statspack表

Statspack建立以后,为了记录快照的统计数据,会创建一系列的以stats$开头的表。其中stats$sql_plan表记录了每个快照中超过其阈值的语句的查询计划。因此我们可以将出现在该表中索引对象排除在监控范围之外:

select a.object_owner, a.object_name

from stats$sql_plan a, stats$sql_plan_usage b

where a.plan_hash_value = b.plan_hash_value

and a.object_type='INDEX'

and b.last_active_time > <START_AUDIT_DATE>;

但是,这张表在默认情况下(snapshot level=5)是不会记录数据的,只有snapshot>=6才会有记录。另外,该表在8i中是没有的。

3、利用AWR数据

10g以后,oracle出现了比statspack更加强大的性能分析工具AWR,它也同样记录了系统中的统计数据以供分析。我们也同样可以从其中分析出那些索引是被使用到的。

select b.object_owner, b.object_name

from dba_hist_snapshot a, dba_hist_sql_plan b, dba_hist_sqlstat c

where a.snap_id = c.snap_id

and b.sql_id=c.sql_id

and b.object_type = 'INDEX'

and a.startup_time > <START_AUDIT_DATE>;


利用上述方法,过滤掉大部分肯定被使用的index后,再综合应用,选择可疑索引进行监控,找出并删除无用索引,为数据库减肥。
标签: 暂无标签
oraunix

写了 199 篇文章,拥有财富 1026,被 339 人关注

转播转播 分享分享1 分享淘帖
回复

使用道具

游客 | 发表于 2011-3-12 09:11:18
相老师,很强大,能给说一下怎么手工建库么。还有数据库升级报了一个错,classes.bin 没有得到想要的大小怎么解决
回复

使用道具

P6 | 发表于 2011-3-12 14:30:08
目前大型的商业系统很多都在使用手工建库,这样数据库体积最小。
否则垃圾太多。
具体步骤:
1、建目录
2、手工编辑pfile,然后建立spfile
3、使用create database命令建立控制文件、基础表空间。
4、跑几个脚本,生成需要的数据字典。
5、根据需要建库。
OK,具体的操作步骤,让OCM们给一个例子。
这个是OCM考试的第一个实验。
至于你说的那个错,贴出来日志看看。
回复

使用道具

游客 | 发表于 2011-3-24 20:33:25
很受用,谢谢,分享
回复

使用道具

您需要登录后才可以回帖 登录 | 加入社区

本版积分规则

意见
反馈