一、何時需要重建索引
- 表上頻繁發生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;