近期决定对生产上流水表的索引进行优化,目前此表有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. 索引优化需要考虑的地方
了解了哪些查询会使用这些索引,然后结合这个表中所有索引的情况来判断是否需要优化。需要考虑如下几方面:
- 每个索引的字段,索引字段顺序,是否存在索引重复
- 索引字段的区分度如何
- 不同索引字段是否不是独立的,而是有相关性的
- 索引字段取值是否有严重倾斜
- 当前表是否有分区,分区方式如何
- 索引是局部索引还是全局索引
- 索引是唯一索引还是非唯一索引