码迷,mamicode.com
首页 > 其他好文 > 详细

索引的重建

时间:2016-08-10 19:27:06      阅读:342      评论:0      收藏:0      [点我收藏+]

标签:

一、何时需要重建索引

  1. 表上频繁发生update,delete操作;
  2. 表上发生了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创建索引的内部过程:

  1. 扫描方式不同。Rebuild以index fast full scan或table full scan方式(到底采用那种方式取决于cost)读取原索引中的数据来构建一个新的索引,重建过程中有排序操作,rebuild online执行表扫描获取数据,重建过程中有排序的操作;
  2. 是否阻塞DML操作。Rebuild会阻塞DML操作,rebuild online不会阻塞DML操作 ;
  3. 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 |
----------------------------------------------------------------------------------------

重建索引过程中的注意事项:

  1. 执行rebuild操作时,需要检查表空间是否足够;
  2. 虽然说rebuild online操作允许DML操作,但还是建议在业务不繁忙时间段进行;
  3. Rebuild操作会产生大量Redo Log;

五、重建分区表上的分区索引

SQL> alter index indexname rebuild partition paritionname tablespace tablespacename;
SQL> alter index indexname rebuild subpartition partitioname tablespace tablespacename;

 

 

 

索引的重建

标签:

原文地址:http://www.cnblogs.com/sunmengbbm/p/5757915.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!