一、何时需要重建索引
- 表上频繁发生update,delete操作;
- 表上发生了alter table ..move操作(move操作导致了rowid变化)。
二、判断某索引是否应被重建
1、索引重建是否有必要,一般看索引是否倾斜的严重,是否浪费了空间,那应该如何才可以判断索引是否倾斜的严重,是否浪费了空间,对索引进行结构分析:
SQL> analyze index index_name validate structure;
2、在相同的session中查询index_stats表
SQL> select height,DEL_LF_ROWS/LF_ROWS from index_stats;
当查询的height>=4(索引的深度,即从根到叶节点的高度)或DEL_LF_ROWS/LF_ROWS>0.2的情况下,就应该考虑重建该索引。
三、如何执行重建索引的操作
1、drop原索引,然后再创建索引
SQL> drop index index_name; SQL> create index index_name on table_name (index_column); 上述方法相当耗时间,不建议使用。
2 、直接重建索引
SQL> alter index indexname rebuild; SQL> alter index indexname rebuild online; 此方法较快,建议使用。
rebuild是快速重建索引的一种有效的办法,因为它是一种使用现有索引项来重建新索引的方法。如果重建索引时有其他用户在对这个表操作,尽量使用带online参数来最大限度的减少索引重建时将会出现的任何加锁问题。由于新旧索引在建立时同时存在,因此,使用这种重建方法需要有额外的磁盘空间可供临时使用,当索引建完后把老索引删除,如果没有成功,也不会影响原来的索引。利用这种办法可以用来将一个索引移到新的表空间。
四、alter index rebuild内部过程和注意事项
Rebuild创建索引的内部过程:
- 扫描方式不同。Rebuild以index fast full scan或table full scan方式(到底采用那种方式取决于cost)读取原索引中的数据来构建一个新的索引,重建过程中有排序操作,rebuild online执行表扫描获取数据,重建过程中有排序的操作;
- 是否阻塞DML操作。Rebuild会阻塞DML操作,rebuild online不会阻塞DML操作 ;
- rebuild online时系统会产生一个SYS_JOURNAL_xxx的IOT类型的系统临时日志表,所有rebuild online时索引的变化都记录在这个表中,当新的索引创建完成后,把这个表的记录维护到新的索引中去,然后drop掉旧的索引,rebuild online就完成了。
示例一、用rebuild方式重建索引的
SQL> explain plan for alter index DBUSRPOS.PK_REPORTREG rebuild; Explained. SQL> set lines 150 SQL> select * from table(dbms_xplan.display); PLAN_TABLE_OUTPUT ------------------------------------------------------------------------------------------------------------------------------------------------------ Plan hash value: 1405161665 --------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------------------- | 0 | ALTER INDEX STATEMENT | | 41 | 246 | 1 (0)| 00:00:01 | | 1 | INDEX BUILD UNIQUE | PK_REPORTREG | | | | | | 2 | SORT CREATE INDEX | | 41 | 246 | | | | 3 | INDEX FAST FULL SCAN| PK_REPORTREG | 41 | 246 | 1 (0)| 00:00:01 | ---------------------------------------------------------------------------------------
示例二、用rebuild online方式重建索引
SQL> explain plan for alter index DBUSRPOS.PK_PRIVATEPARA rebuild online; Explained. SQL> set lines 150 SQL> select * from table(dbms_xplan.display); PLAN_TABLE_OUTPUT ------------------------------------------------------------------------------------------------------------------------------------------------------ Plan hash value: 3437353873 ---------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ---------------------------------------------------------------------------------------- | 0 | ALTER INDEX STATEMENT | | 94 | 282 | 1 (0)| 00:00:01 | | 1 | INDEX BUILD UNIQUE | PK_PRIVATEPARA | | | | | | 2 | SORT CREATE INDEX | | 94 | 282 | | | | 3 | TABLE ACCESS FULL | PRIVATEPARA | 94 | 282 | 1 (0)| 00:00:01 | ----------------------------------------------------------------------------------------
重建索引过程中的注意事项:
- 执行rebuild操作时,需要检查表空间是否足够;
- 虽然说rebuild online操作允许DML操作,但还是建议在业务不繁忙时间段进行;
- Rebuild操作会产生大量Redo Log;
五、重建分区表上的分区索引
SQL> alter index indexname rebuild partition paritionname tablespace tablespacename; SQL> alter index indexname rebuild subpartition partitioname tablespace tablespacename;