您的位置:首页 > 其它

不开index monitor的情况下判断索引是否被使用过

2013-09-05 21:18 232 查看
from http://blog.csdn.net/ljunjie82/article/details/11023173 踩点

如果要知道某个索引是否会被使用过,传统的方法是开启index monitor。但此方法有两点不足之处:(1)会带来小量的性能负载(2)只能在开启监控后,要观察一段时间才能知道是否被使用过,需要观察多久才能得到数据无法确定,然而往往要确认索引是否被使用过时,希望立即能拿到数据

今天突然想到一种办法,SQL执行计划中的访问对象“NAME”列不是也有访问的对象信息么,其中也包含访问的索引名称呢。查SQL执行计划信息不就可以知道索引是否有被用到了么。

SQL语句在执行时如果进行过硬解析就会产生执行计划,即便是软解析,那么在内存中也会存在执行计划,即便执行计划已经从shared_pool中刷出去了,只要在产生快照时有存在shared_pool中,那么还可以从AWR数据中查得到历史的执行计划。

有了这个思路就好办了,下面两种方法可以查看到指定的索引以前是否被使用过:

第一、从v$sql_plan视图中查看还存在shared_pool中的访问了指定索引的执行计划记录

SELECT SQL_ID, PLAN_HASH_VALUE, TIMESTAMP, OBJECT_NAME
FROM V$SQL_PLAN
WHERE OBJECT_NAME = 'INDEX_LITEST2_OBJECTID'

sql_id
plan_hash_value
options
timestamp
object_name
3j6xbabaz36v9
2954962778
RANGE SCAN
2013/9/12 23:38
INDEX_LITEST2_OBJECTID
dpaj071ypmj9j
3938988231
RANGE SCAN
2013/9/12 23:38
INDEX_LITEST2_OBJECTID
以上查询结果,说明“INDEX_LITEST2_OBJECTID”这个索引在2013/9/12 23:38解析的plan_hash_value为2954962778、3938988231的SQL语句中用到了该索引。

第二、查看历史以来使用了指定索引的执行计划记录

如果从shared_pool中查不到指定索引的记录,还可以从AWR历史数据中查找,如下:

SELECT SQL_ID, PLAN_HASH_VALUE, OPERATION, OPTIONS, TIMESTAMP, OBJECT_NAME
FROM DBA_HIST_SQL_PLAN
WHERE OBJECT_NAME = 'IDX_INVOICE_001'
ORDER BY 5 DESC

sql_id
plan_hash_value
options
timestamp
object_name
f5bnpqug8a13f
1001597107
RANGE SCAN
2013/9/2 19:00
IDX_INVOICE_001
db0zvtnr5qugm
1001597107
RANGE SCAN
2013/9/2 18:58
IDX_INVOICE_001
fy7r1q6bdpk0f
1001597107
RANGE SCAN
2013/9/2 18:56
IDX_INVOICE_001
0n5b0jfdaukvq
1001597107
RANGE SCAN
2013/9/2 18:54
IDX_INVOICE_001
6zpj6sdmmhh14
1001597107
RANGE SCAN
2013/9/2 18:48
IDX_INVOICE_001
gwcpdx6yafsm2
1001597107
RANGE SCAN
2013/9/2 18:42
IDX_INVOICE_001
54nfxwgjw95g4
1001597107
RANGE SCAN
2013/9/2 18:40
IDX_INVOICE_001
40797ymubw53n
1001597107
RANGE SCAN
2013/9/2 18:35
IDX_INVOICE_001
7t7267bz2qvjy
1001597107
RANGE SCAN
2013/9/2 18:26
IDX_INVOICE_001
该方法可以查看到的历史时长,需要根据您的AWR历史数据保留时长而定。

本文由“踩点”所作,转发请说明出处。谢谢!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: