love wife love life —Roger的Oracle/MySQL/PostgreSQL数据恢复博客

Phone:18180207355 提供专业Oracle/MySQL/PostgreSQL数据恢复、性能优化、迁移升级、紧急救援等服务

关于index的监控

本站文章除注明转载外,均为本站原创: 转载自love wife love life —Roger的Oracle/MySQL/PostgreSQL数据恢复博客

本文链接地址: 关于index的监控

从上面我们可以发现,如果index被重建,那么其监控将被停止。 所以这里存在2个很大的问题:

1. 如何确保index重建后也能会监控?我们知道,对于dml操作频繁的表来说,定期重建index是很有必要的;

2. 如何才能知道一个索引的使用情况呢?或者说其使用频率?这里存在一种可能,如果某个索引在过去使用过,但是现在没使用,但是数据字典应该已经记录了其信息,所以通过查询$object_usage就不准确了;另外index的使用频率怎么样?可能是1天使用1万次,也可能是1天使用1次或者更甚至3天才使用1次,那么对于这种使用频率低的index完全可以删除。

从上面来看,单纯的从v$segment_statistics或V_$SEGSTAT中的db block changes来判断,根本不准确。
那么到底有没有方法能知道index的使用频率呢?或者说能大概估算也行?下面继续实验…..

这里我们可以通过其EXECUTIONS 来进行判断,前提是我要知道这个sql语句可能会使用index,
如在这里执行的delete语句,执行计划如下:

不过这里有一点需要注意的是,对于使用了绑定变量的情况,我们要忽略bing peeking的影响。
比如这里的delete语句实际上执行了500次,那么可能其中有1次或2次由于
bing peeking的原因而在其执行计划中未走index。

如果是查历史信息,我们还可以查询相关的hist视图,如下:

总的来说,通过如上两种方式来查询判断index的使用频率,我个人认为还是比较准确的,应该是
可以判断出index的使用频率,这里做个简单的总结:

1. 如果是根据v$视图来查询,这样有很大的局限性,因为一段时间后可能sql已经从
   shared pool中被clean out了,对于shared pool较大的情况下,我认为可以定期的
   进行采样分析,不过根据业务情况,系统负载以及时间段等关系,可能存在较大的差异;

2. 另外一种方式是通过hist视图来查询,我认为这种方式相对比较准确,比如,我想查询某个index
   在过去某一天时间内(10g默认值awr快照保留1周)的使用情况,那么需要修改前面的sql语句,加上
   SNAP_ID即可,其实这种方式也有一定的局限性和缺陷,因为超过7天的将无法进行查询,不过我想
   即使最近7天的快照也足以满足我们的需求了。
  
下面贴下sql语句:

最好是根据object#去查询比较好,如下:

One Response to “关于index的监控”

  1. 木鱼 Says:

    如果index没用monitoring usage,也可以用你这语句查出来对吧?
    还有你说的第一个问题没看到你怎么解决的

Leave a Reply

You must be logged in to post a comment.