【IT168 技术文档】
识别索引是否被使用最准确的方法是使用索引监控,但该方法对系统的性能消耗是相当严重的,特别在访问量较大的系统,可能会导致系统挂掉,但在开发数据库上,还是不错的选择。
下面给大家介绍另三种方法,虽然不敢说很准确,还是相当有用的,就是一种方法是通过v$segment_statistics视图,查看这个视图中的信息,基本上可以确定索引是否被使用,如果该索引的逻辑读较,那该索引通常使用就比较频繁:
1 select object_name,statistic_name,value 2 from v$segment_statistics 3* where object_name like upper('%&object_name%') 21:48:38 SQL> / Enter value for object_name: IND_AUCTION_PRICE_TYPE old 3: where object_name like upper('%&object_name%') new 3: where object_name like upper('%IND_AUCTION_PRICE_TYPE%') OBJECT_NAME STATISTIC_NAME VALUE -------------------------------- ------------------------------- ---------- IND_AUCTION_PRICE_TYPE logical reads 36723920 IND_AUCTION_PRICE_TYPE buffer busy waits 907 IND_AUCTION_PRICE_TYPE db block changes 13092496 IND_AUCTION_PRICE_TYPE physical reads 798169 IND_AUCTION_PRICE_TYPE physical writes 1568374 IND_AUCTION_PRICE_TYPE physical reads direct 0 IND_AUCTION_PRICE_TYPE physical writes direct 0 IND_AUCTION_PRICE_TYPE global cache cr blocks served 0 IND_AUCTION_PRICE_TYPE global cache current blocks served 0 IND_AUCTION_PRICE_TYPE ITL waits 14 IND_AUCTION_PRICE_TYPE row lock waits 12397
但这个方法是不是准确的,因为如果该表的DML非常频繁,很可能即是索引没有被使用,但它的逻辑读与物理读都比较高,但不失为一种比较有用的参考。
现在介绍另一种方法,该方法比较适合在运行一段时间的系统中使用,就是通过v$sqlarea动态性能视图来判断,查看v$sqlarea中sql_text内容的where条件后边部分是否有引用该字段的SQL,这种方法是相当准确的,如果运行次数较少或没有,就可以确定该字典的索引是低效的,可以考虑删除。。。
SQL如下:
第四种方法应该是最简单最方便的,第三种虽然也可以找到问题,但需要对返回的SQL进行识别,从v$sql_plan动态性能视图中找到的肯定可以确定已经被使用过,相关的SQL比较简单,见如下所示:
select sql_text,executions from v$sqlarea where upper(sql_text) like '%WHERE%&KEYWORD%';
第四种方法应该是最简单最方便的,第三种虽然也可以找到问题,但需要对返回的SQL进行识别,从v$sql_plan动态性能视图中找到的肯定可以确定已经被使用过,相关的SQL比较简单,见如下所示:
select hash_value from v$sql_plan where object_name like '%&OBJECT_NAME%';