Oracle查看索引历史使用情况

近期决定对生产上流水表的索引进行优化,目前此表有18个索引,其中8个全局索引。这些索引的产生有历史原因了,因为当时大家对索引和分区也不太清楚,后来查询效率有问题时所作的优化也只是增加索引,进而导致现在索引数量过多,大量索引重复或不优(索引后面字段根本没有用)。

首先要确认有哪些查询会用到某个索引(可以先针对于某些可能有问题的索引进行排查),具体查询过程如下:

1.查询v$sql_plan视图查看当前有哪些使用此索引

---- object_name 为索引的名称
select sql_id from v$sql_plan where object_name='T1_INDEX_N1';  
select sql_fulltext from v$sql where sql_id='sql_id';

或是直接查

select sql_id,sql_fulltext from v$sql where sql_id in (select sql_id from v$sql_plan where object_name='T1_INDEX_N1');

如果sql_fulltext未显示完整,可以在sqlplus中配置long的长度,如下:

SQL> set linesize 200
SQL> set pagesize 1000
SQL> set long 10000

2.查询历史执行计划表dba_hist_sql_plan查看历史上有哪些查询使用了此sql

---- object_name 为索引的名称
select SQL_ID,PLAN_HASH_VALUE,OPERATION,OPTIONS,OBJECT_NAME from dba_hist_sql_plan where object_name='<OBJECT_NAME>';
select sql_text from dba_hist_sqltext where sql_id='<sql_id>';

或直接联查:

select sql_id,sql_text from dba_hist_sqltext where sql_id in ( select SQL_ID from dba_hist_sql_plan where object_name='<OBJECT_NAME>');

3. 索引优化需要考虑的地方

了解了哪些查询会使用这些索引,然后结合这个表中所有索引的情况来判断是否需要优化。需要考虑如下几方面:

  1. 每个索引的字段,索引字段顺序,是否存在索引重复
  2. 索引字段的区分度如何
  3. 不同索引字段是否不是独立的,而是有相关性的
  4. 索引字段取值是否有严重倾斜
  5. 当前表是否有分区,分区方式如何
  6. 索引是局部索引还是全局索引
  7. 索引是唯一索引还是非唯一索引

文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接 《ITechLib》

留言:

(lesstile enabled - surround code blocks with ---)