不开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中的访问了指定索引的执行计划记录
以上查询结果,说明“INDEX_LITEST2_OBJECTID”这个索引在2013/9/12 23:38解析的plan_hash_value为2954962778、3938988231的SQL语句中用到了该索引。
第二、查看历史以来使用了指定索引的执行计划记录
如果从shared_pool中查不到指定索引的记录,还可以从AWR历史数据中查找,如下:
该方法可以查看到的历史时长,需要根据您的AWR历史数据保留时长而定。
本文由“踩点”所作,转发请说明出处。谢谢!
如果要知道某个索引是否会被使用过,传统的方法是开启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 |
第二、查看历史以来使用了指定索引的执行计划记录
如果从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 |
本文由“踩点”所作,转发请说明出处。谢谢!
相关文章推荐
- 不开index monitor的情况下判断索引是否被使用过
- 不用index monitor usage获得索引使用情况的脚本
- 分析oracle索引空间使用情况,以及索引是否须要重建
- postgresql查看表的和索引的情况,判断是否膨胀
- 使用INDEX_STATS重建索引判断
- oracle数据库查询Sql语句是否使用索引及常见的索引失效的情况
- Sqlserver 2005+:查看索引【index】的【使用情况】:无效的索引、高成本索引
- 使用三目运算符,判断两个对象是否相等(包括null的情况)
- 分析oracle索引空间使用情况,以及索引是否需要重建
- oracle 创建、使用索引和判断索引是否被使用
- 使用稀疏索引来判断键是否存在
- Oracle使用PLsql时判断索引是否生效
- oracle order by 索引是否使用的情况
- 测试复合索引在oracle、sql server 、mysql各种情况下是否使用索引
- 使用tabhost换号登录情况是否需要刷新tab页的逻辑判断
- 分析oracle索引空间使用情况,以及索引是否需要重建
- 处理数组时,很多情况要注意判断数组的长度是否大于0,否则很容易因索引溢出而导致程序崩溃
- 判断一个整型数组是否包含另外一个数组(未使用异常类的情况下)
- MYSQL 用 explain 语句判断select查询是否使用了索引
- mysql中index的如何使用,判断什么时候加索引(强烈推荐)