索引的重建


一、何時需要重建索引

  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;

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM