日期:2014-05-16 浏览次数:20519 次
如果要知道某个索引是否会被使用过,传统的方法是开启index monitor。但此方法有两点不足之处:(1)会带来小量的性能负载(2)只能在开启监控后,要观察一段时间才能知道是否被使用过,需要观察多久才能得到数据无法确定,然而往往要确认索引是否被使用过时,希望立即能拿到数据
今天突然想到一种办法,SQL执行计划中的访问对象“NAME”列不是也有访问的对象信息么,其中也包含访问的索引名称呢。查SQL执行计划信息不就可以知道索引是否有被用到了么。
SQL语句在执行时如果进行过硬解析就会产生执行计划,即便是软解析,那么在内存中也会存在执行计划,即便执行计划已经从shared_pool中刷出去了,只要在产生快照时有存在shared_pool中,那么还可以从AWR数据中查得到历史的执行计划。
有了这个思路就好办了,下面两种方法可以查看到指定的索引以前是否被使用过:
第一、从v$sql_plan视图中查看还存在shared_pool中的访问了指定索引的执行计划记录
SQL>select sql_id,plan_hash_value,timestamp,object_namefrom v$sql_plan whereobject_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语句中用到了该索引。
第二、通过dba_hist_sql_plan视图从AWR历史数据中查看指定索引的执行计划记录
如果从shared_pool中查不到指定索引的记录,还可以从AWR历史数据中查找,如下:
SQL> select sql_id,plan_hash_value,operation,options,timestamp,object_namefrom dba_hist_sql_plan whereobject_name='IDX_INVOICE_001'orderby5 desc
sql_id |
<
免责声明: 本文仅代表作者个人观点,与爱易网无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
|