rebuild與rebuild online效率比對

yangzhangyue發表於2013-11-06
在停機時間清理分割槽表分割槽後,重建索引。以下是三次重建索引的操作記錄。
12:28:26 sys@DAVID>alter index DW0.IDX_DAVID_RESEQ rebuild ;

Index altered.

Elapsed: 00:23:36.16

Elapsed: 00:29:09.62
13:51:35 sys@DAVID>alter index DW0.IDX_DAVID_RESEQ rebuild  online ;

Index altered.

Elapsed: 01:15:23.79
15:11:19 sys@DAVID>alter index DW0.IDX_DAVID_RESEQ rebuild parallel 5;

Index altered.

Elapsed: 00:07:54.67


可以看到rebuild效率明顯高於rebuild online,我們來看看其執行計劃。


Rebuild:

Plan hash value: 3167759897

-------------------------------------------------------------------------------------------------
| Id  | Operation              | Name                   | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------------
|   0 | ALTER INDEX STATEMENT  |                        |    10M|    51M| 48518   (2)| 00:09:43 |
|   1 |  INDEX BUILD NON UNIQUE| IDX_DAVID_RESEQ |       |       |            |          |
|   2 |   SORT CREATE INDEX    |                        |    10M|    51M|            |          |
|   3 |    INDEX FAST FULL SCAN| IDX_DAVID_RESEQ |       |       |            |          |
-------------------------------------------------------------------------------------------------

Rebuild online
Plan hash value: 2561495399

-----------------------------------------------------------------------------------------------------------------
| Id  | Operation              | Name                   | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
-----------------------------------------------------------------------------------------------------------------
|   0 | ALTER INDEX STATEMENT  |                        |    10M|    51M| 48518   (2)| 00:09:43 |       |       |
|   1 |  INDEX BUILD NON UNIQUE| IDX_DAVID_RESEQ |       |       |            |          |       |       |
|   2 |   SORT CREATE INDEX    |                        |    10M|    51M|            |          |       |       |
|   3 |    PARTITION RANGE ALL |                        |    10M|    51M| 48518   (2)| 00:09:43 |     1 |   283 |
|   4 |     PARTITION HASH ALL |                        |    10M|    51M| 48518   (2)| 00:09:43 |     1 |     1 |
|   5 |      TABLE ACCESS FULL | PAYMENTORDER           |    10M|    51M| 48518   (2)| 00:09:43 |     1 |   283 |
-----------------------------------------------------------------------------------------------------------------


首先,rebuild 和rebuild online的操作方式是不同的,rebuild只會掃描原索引,而rebuild online需要全表掃描。
其實這個是很好理解的。Rebuild時會阻塞dml,所以,原索引是不會變化的,只需要早原索引的基礎上重建即可,索引rebuild的效率要高的多。

我們還看到第一個rebuild的時間雖然比rebuild online的時間短的多,但是比最後一次rebuild要長的多。
這是因為第一個rebuild也需要全表掃描,這是因為,清理分割槽後,索引變得不可用,所以不能在原索引上重建。

那既然都是全表掃描重建索引,第一個rebuild和rebuild online有什麼區別嗎?

一、rebuild 會阻塞dml語句而rebuild online則不會。
二、rebuild online時系統會產生一個SYS_XXX_xxx的IOT型別的系統臨時日誌表,所有rebuild online時索引的變化都記錄在這個表中,當新的索引建立完成後,把這個表的記錄維護到新的索引中去,然後drop掉舊的索引,rebuild online就完成了,這些臨時segment都可以在rebuild在資料庫中可以看到,

所以它們雖然執行計劃是一致的,但其實其操作方式是完全不同的。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29033984/viewspace-775913/,如需轉載,請註明出處,否則將追究法律責任。

相關文章