oracle重建索引(三)
重建索引有多種方式,如drop and re-create、rebuild、rebuild online等。下面簡單比較這幾種方式異同以及優缺點:
相關文章:
三、rebuild和rebuild online的資料來源
網上一直有這樣一個說法:重建索引是以原索引作為資料來源的。那麼,這種說法是否準確呢?我們做實驗來驗證一下:
suk@ORACLE9I> COL SEGMENT_NAME FORMAT A30
--首先看看錶和索引的大小
suk@ORACLE9I> SELECT SEGMENT_NAME,BYTES FROM USER_SEGMENTS WHERE SEGMENT_NAME IN ('TEST','IDX_TEST_C1');
SEGMENT_NAME BYTES
------------------------------ ----------
TEST 201326592
IDX_TEST_C1 293601280
suk@ORACLE9I> EXPLAIN PLAN FOR ALTER INDEX IDX_TEST_C1 REBUILD;
已解釋。
suk@ORACLE9I> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY());
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
-----------------------------------------------------------------------
| 0 | ALTER INDEX STATEMENT | | | | |
| 1 | INDEX BUILD NON UNIQUE| IDX_TEST_C1 | | | |
| 2 | SORT CREATE INDEX | | | | |
| 3 | TABLE ACCESS FULL | TEST | | | |
-----------------------------------------------------------------------
Note: rule based optimization
已選擇11行。
--從執行計劃可以看出,當索引比表大時,rebuild索引用的資料來源是基表。
suk@ORACLE9I> EXPLAIN PLAN FOR ALTER INDEX IDX_TEST_C1 REBUILD ONLINE;
已解釋。
suk@ORACLE9I> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY());
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
-----------------------------------------------------------------------
| 0 | ALTER INDEX STATEMENT | | | | |
| 1 | INDEX BUILD NON UNIQUE| IDX_TEST_C1 | | | |
| 2 | SORT CREATE INDEX | | | | |
| 3 | TABLE ACCESS FULL | TEST | | | |
-----------------------------------------------------------------------
Note: rule based optimization
已選擇11行。
--從執行計劃可以看出,當索引比表大時,rebuild online索引用的資料來源是基表。
--我們為TEST新增一列,使得表比索引大
suk@ORACLE9I> ALTER TABLE TEST ADD(C2 CHAR(30) DEFAULT '1');
表已更改。
suk@ORACLE9I> SELECT SEGMENT_NAME,BYTES FROM USER_SEGMENTS WHERE SEGMENT_NAME IN ('TEST','IDX_TEST_C
1');
SEGMENT_NAME BYTES
------------------------------ ----------
TEST 1476395008
IDX_TEST_C1 293601280
suk@ORACLE9I> EXPLAIN PLAN FOR ALTER INDEX IDX_TEST_C1 REBUILD;
已解釋。
suk@ORACLE9I> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY());
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
-----------------------------------------------------------------------
| 0 | ALTER INDEX STATEMENT | | | | |
| 1 | INDEX BUILD NON UNIQUE| IDX_TEST_C1 | | | |
| 2 | SORT CREATE INDEX | | | | |
| 3 | INDEX FAST FULL SCAN| IDX_TEST_C1 | | | |
-----------------------------------------------------------------------
Note: rule based optimization
已選擇11行。
--從執行計劃可以看出,當表比索引大時,執行計劃已經改變,rebuild索引是以索引作為資料來源的。
suk@ORACLE9I> EXPLAIN PLAN FOR ALTER INDEX IDX_TEST_C1 REBUILD ONLINE;
已解釋。
suk@ORACLE9I> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY());
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
-----------------------------------------------------------------------
| 0 | ALTER INDEX STATEMENT | | | | |
| 1 | INDEX BUILD NON UNIQUE| IDX_TEST_C1 | | | |
| 2 | SORT CREATE INDEX | | | | |
| 3 | TABLE ACCESS FULL | TEST | | | |
-----------------------------------------------------------------------
Note: rule based optimization
已選擇11行。
--從執行計劃可以看出,當表比索引大時,rebuild online仍然以基表作為資料來源。
rebuild模式下,因為表資料不會產生變化,oracle主要考慮效能問題,把更快掃描完成的段作為資料來源。在上面的例子中,我們並沒有對錶進行分析,故oracle應該根據資料段的大小來決定那個作為資料來源的。一般索引欄位比較多,或者對索引欄位的DML操作較多,可能會導致索引比表大,這時oracle就會使用基表作為新索引的資料來源進行rebuild了。
而在rebuild online模式下,因為允許DML操作,而表資料變化的同時索引也會跟著變化,為了索引與基表資料的一致性,比如採用基表資料作為資料來源,而不能用原索引資料作為資料來源。
我們用反證法證明不能用原索引作為新索引的資料來源。
例如:
T1發出rebuild online命令
T2刪除某條資料,刪資料的同時,oracle會自動維護了舊索引
T3掃描經過T2資料所在索引節點
T4插入一條記錄,新記錄對應的索引節點剛好重用了T2刪除的資料對應的索引節點空間
如果是這樣的話,新建的索引將不包含T4插入的記錄的資訊。所以,rebuild online情況下新索引的資料來源不能是原索引。
rebuild online情況下,如果非用原索引作為新索引的資料來源的話,用中間表記錄索引變化的方法應該是可以實現的,但由於資料變化會同時引起索引變化的特定決定了這種方法將異常複雜及效率底下,所以oracle不考慮舊索引作為新索引的資料來源是有道理的。
結論:
1、rebuild會阻塞對基表的DML操作,但不會影響rebuild期間查詢對原有索引的使用。
2、rebuild的資料來源可能是基表,也可能是原索引。取決於基表和原索引的大小,那個小,rebuild時就會用那個作為資料來源。這也說明了網上盛傳的rebuild以原索引作為資料庫的說法是不完全正確的。
3、rebuild online執行使用者在索引重建期間執行DML操作。
4、rebuild online的資料來源是基表。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/231499/viewspace-63811/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle重建索引Oracle索引
- oracle 索引分析及索引重建Oracle索引
- oracle重建索引(一)Oracle索引
- oracle重建索引(二)Oracle索引
- oracle批量重建索引方法Oracle索引
- oracle 索引重建提示指令碼Oracle索引指令碼
- Oracle表與索引的分析及索引重建Oracle索引
- 淺談oracle中重建索引 (ZT)Oracle索引
- Oracle表與索引的分析及索引重建(轉)Oracle索引
- oracle 索引什麼時候重建和重建方法討論Oracle索引
- Oracle 表的移動和索引的重建Oracle索引
- 索引的重建命令索引
- sqlserver 全部索引重建SQLServer索引
- MSSQL Rebuild(重建)索引SQLRebuild索引
- 【TUNE_ORACLE】索引定期重建的利與弊Oracle索引
- 關於 Oracle 分割槽索引的失效和重建Oracle索引
- 淺談索引系列之索引重建索引
- 關於oracle的索引重建問題及原因分析Oracle索引
- oracle重建索引的一些參考性依據Oracle索引
- 批量重建不可用索引索引
- 教你如何在 elasticsearch 中重建索引Elasticsearch索引
- 索引重建的資料來源索引
- Oracle表table與索引index的分析及索引重建及統計資訊匯入匯出Oracle索引Index
- 【TUNE_ORACLE】Oracle索引設計思想(四)三星級索引Oracle索引
- oracle重建ocrOracle
- Oracle OEM重建Oracle
- 重建oracle EMOracle
- 記一次Oracle分割槽表全域性索引重建的過程Oracle索引
- 如何在Mac上重建Spotlight索引Mac索引
- 索引重建的資料來源(二)索引
- Oracle 索引的三個問題(轉)Oracle索引
- 三維重建基礎
- oracle DBA 角色重建Oracle
- ORACLE RAC重建OCROracle
- oracle 重建EM databaseOracleDatabase
- SQL Server 2014的重建索引SQLServer索引
- 說說生產系統索引的重建索引
- sqlserver索引重建和索引重組的區別和操作方法SQLServer索引