`

index rebuild online

阅读更多
SQL> select segment_name ,segment_type from user_segments where TABLESPACE_NAME='INDEX_TS';

SEGMENT_NAME
--------------------------------------------------------------------------------
SEGMENT_TYPE
------------------
EMP_IDX
INDEX

EMP_PK
INDEX

DEPT_PK
INDEX

SQL> select * from emp where empno='123';
select * from emp where empno='123'
*
ERROR at line 1:
ORA-00376: file 10 cannot be read at this time
ORA-01110: data file 10: '/u01/oradata/index_ts01.ora'

SQL> create tablespace index_ts_temp datafile '/u01/oradata/index_ts_temp01.ora' size 128m;
connect
Tablespace created.

SQL> drop tablespace index_ts INCLUDING CONTENTS;
drop tablespace index_ts INCLUDING CONTENTS
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-02429: cannot drop index used for enforcement of unique/primary key

SQL> alter index DEPT_PK rebuild tablespace index_ts_temp;
alter index DEPT_PK rebuild tablespace index_ts_temp
*
ERROR at line 1:
ORA-00376: file 10 cannot be read at this time
ORA-01110: data file 10: '/u01/oradata/index_ts01.ora'
 



因为不是在线rebuild ,所以会读取原来index 的数据

SQL> alter index DEPT_PK rebuild tablespace index_ts_temp online;

Index altered.

加上online 表示不读取原来index 的数据,直接从table 里面读取数据重新建立 index

 

 

 

 

 

一、前一篇文章的案例中提到,索引损坏了,重建索引时,直接rebuild报错,而rebuild online则可以,这主要是两者重建索引

时的扫描方式不同,rebuild用的是“INDEX FAST FULL SCAN”,rebuild online用的是“TABLE ACCESS FULL”:
SQL> explain plan for
  2  alter index ind_test_id rebuild;
 
Explained.
 
SQL> select * from table(dbms_xplan.display);
 
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------
Plan hash value: 187312216
 
--------------------------------------------------------------------------------------
| Id  | Operation              | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------
|   0 | ALTER INDEX STATEMENT  |             |   115K|   565K|    78   (2)| 00:00:10 |
|   1 |  INDEX BUILD NON UNIQUE| IND_TEST_ID |       |       |            |          |
|   2 |   SORT CREATE INDEX    |             |   115K|   565K|            |          |
|   3 |    INDEX FAST FULL SCAN| IND_TEST_ID |       |       |            |          |
--------------------------------------------------------------------------------------
 
10 rows selected.
 
SQL> explain plan for
  2  alter index ind_test_id rebuild online;
 
Explained.
 
SQL> select * from table(dbms_xplan.display);
 
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------
Plan hash value: 3365522411
 
--------------------------------------------------------------------------------------
| Id  | Operation              | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------
|   0 | ALTER INDEX STATEMENT  |             |   115K|   565K|    78   (2)| 00:00:10 |
|   1 |  INDEX BUILD NON UNIQUE| IND_TEST_ID |       |       |            |          |
|   2 |   SORT CREATE INDEX    |             |   115K|   565K|            |          |
|   3 |    TABLE ACCESS FULL   | TEST        |   115K|   565K|    78   (2)| 00:00:10 |
--------------------------------------------------------------------------------------
 
10 rows selected.


二、rebuild index online在执行期间不会阻塞DML操作,但在开始和结束阶段,需要请求模式为4的TM锁。因此,如果在rebuild index online开始前或结束时,有其它长时间的事物在运行,很有可能就造成大量的锁等待。具体可以参考:
rebuild index online的锁机制浅析
11G中有所不同:
rebuild index online的锁机制浅析(续)

这里可以通过设置10626事件,避免阻塞该表上的其它DML操作,但在rebuild index online开始、结束阶段有其它事物未完成,则会失败,报ORA-00051: timeout occurred while waiting for a resource 错误:
(以下测试在9208、10203中测试通过,在10201中等待几秒后,直接报ORA-00051,之后再想重建则报ORA-08104,处理方法见后面,因而设置该事件还需谨慎)
会话一:SQL> select max(sid) from v$mystat;
 
  MAX(SID)
----------
        82
 
SQL> delete from test_ls where id=1;
 
1 row deleted.


会话二:SQL> select max(sid) from v$mystat;
 
  MAX(SID)
----------
        70
 
SQL> alter session set events '10626 trace name context forever';
 
Session altered.
 
SQL> alter index IND_TEST_ID rebuild online;


此时会话二会话被阻塞。

会话三:SQL> delete from test_ls where id=3;
 
1 row deleted.
 
SQL> commit;
 
Commit complete.
 
SQL> select * from test_ls where id=3;
 
no rows selected


会话三的DML操作并不会被阻塞。

会话一rollback后,会话二报错:alter index IND_TEST_ID rebuild online
*
ERROR at line 1:
ORA-00051: timeout occurred while waiting for a resource


增加表的数据量,同样可以测出在rebuild online结束时,如果该表上还有其它事物未完成,则报错,如果无其它事物,索引可以重建成功,期间都不会阻塞其它DML操作。

三、rebuild onlie时,如果发生意外中断,很容易造成ORA-08104错误,之后再想rebuild、drop索引都会报错。10G之前需要等待SMON去清理,10G以后可以使用DBMS_REPAIR.ONLINE_INDEX_CLEAN进行手工清理:SQL> alter index IND_TEST_ID rebuild online;
alter index IND_TEST_ID rebuild online
*
ERROR at line 1:
ORA-08104: this index object 93996 is being online built or rebuilt
 
SQL> DECLARE
  2    RetVal BOOLEAN;
  3    OBJECT_ID BINARY_INTEGER;
  4    WAIT_FOR_LOCK BINARY_INTEGER;
  5 
  6  BEGIN
  7    OBJECT_ID := 93996;
  8    WAIT_FOR_LOCK := NULL;
  9 
 10    RetVal := SYS.DBMS_REPAIR.ONLINE_INDEX_CLEAN ();
 11    COMMIT;
 12  END;
 13  / 
 
PL/SQL procedure successfully completed.
 
SQL> alter index ind_test_id rebuild online;
 
Index altered.

分享到:
评论

相关推荐

    数据库优化以及操作说明

    @FragmentationMedium = 'INDEX_REORGANIZE,INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE', @FragmentationHigh = 'INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE', @FragmentationLevel1 = 5, @...

    如何重建索引

    **ALTER INDEX REBUILD与ALTER INDEX REBUILD ONLINE的主要区别在于扫描方式的不同:** 1. **扫描方式不同:** - `REBUILD`命令使用`INDEX FAST FULL SCAN`(或`TABLE FULL SCAN`,具体取决于统计信息的成本)来...

    oracle 11g ocp052考试题答案解析

    文档中提到,如果遇到索引碎片化问题,可以使用ALTER INDEX REBUILD ONLINE命令来重建索引,从而在不干扰当前使用该索引的用户的情况下减少碎片化。重建索引是一种有效的方法,它通过创建一个新的索引结构,并在过程...

    ORACLE重建索引总结

    2. 直接重建:`ALTER INDEX indexname REBUILD`或`ALTER INDEX indexname REBUILD ONLINE`。后者在不影响DML操作的情况下重建索引,推荐使用。 四、`ALTER INDEX REBUILD`内部过程与注意事项 1. 扫描方式差异:`...

    oracle 索引

    4. 维护索引:可以使用ALTER INDEX REBUILD或ALTER INDEX REBUILD ONLINE来重建索引,优化其结构。 五、索引策略 1. 选择合适的索引类型:根据查询模式和数据分布选择最佳索引类型。 2. 索引设计:考虑哪些列经常...

    在Unix服务器上设置Oracle全文检索 (2)

    可以通过查询`CTXSYS.CTX_INDEXES`找出问题索引,然后使用`ALTER INDEX REBUILD ONLINE PARAMETERS('SYNC')`重建索引,或者使用`DROP INDEX FORCE`强制删除并重新创建。 5. **Chinese_lexer失败**:如果使用`...

    ALTER 命令收集

    ALTER INDEX table_index REBUILD ONLINE; ``` 与常规的重建索引不同,`ONLINE`选项允许在不锁定表的情况下重建索引,从而在索引维护期间保持表的可用性。 ### 三、ALTER DATABASE命令详解 `ALTER DATABASE`命令...

    oracle工作笔记

    ALTER INDEX S_SMG_MO_QUANWANGHT_HOUR_INDEX REBUILD ONLINE; ``` - 重建分区索引: ```sql ALTER INDEX MCPP.S_SMG_MT_T_DST_USER REBUILD PARTITION MT2008_10_15 ONLINE; ``` #### 四、查询表空间大小和...

    Oracle OCP 1Z0 052 PDF 199题 题库

    使用ALTER INDEX REBUILD ONLINE命令可以在线重建索引,这意味着索引在重建过程中仍然可以被查询使用,不会影响到正在进行的事务。因此,选项B是最合适的选择。 **题目4:NOARCHIVELOG 模式下的备份** **问题描述...

    oracle 052题库解析

    因此,为了不影响用户,应选择选项B,但在实际操作中,可能需要使用在线重构建索引(如ALTER INDEX REBUILD ONLINE),这样可以在不锁定索引的情况下进行重建。 4. Oracle数据库的Undo管理:Oracle数据库使用Undo表...

    Oracle重构索引

    ALTER INDEX IDX_TEST_C1 REBUILD ONLINE; ``` #### 四、索引重构示例分析 接下来,我们将通过一个具体的示例来进一步理解这些重构方式。 假设有一个名为`TEST`的表,其中包含一个名为`C1`的字段。现在我们需要...

    oracle在线创建索引和重组索引

    alter index index_name rebuild [tablespace tbs_index2] online [compute statistics]; ``` 三、快速创建/重组索引 如果索引实在太大,如几十个 G 的索引,创建一次或者重组一次需要耗费很长的时间。在这种情况下...

    OCP 052PDF版本

    Rebuild the index using the ALTER INDEX...REBUILD ONLINE command.** - 这个选项是正确的。通过在线重建索引(`ALTER INDEX...REBUILD ONLINE`)可以有效地减少碎片化,同时不会影响到索引的正常使用。 - **C. ...

    常用的Oracle SQL 语句

    ALTER INDEX owner.tablename REBUILD ONLINE; ``` 例如,若要在线重建名为`Isample`的索引,属于`LISADMIN`用户的,命令可能如下: ```sql ALTER INDEX LISADMIN.Isample REBUILD ONLINE; ``` 需要注意的是,在线...

    OCP题库-052.188道

    - **选项 B**:使用 `ALTER INDEX...REBUILD ONLINE` 命令在线重建索引可以有效减少索引碎片,且不会影响正在使用该索引的用户。 #### 示例命令 ```sql ALTER INDEX pk_empre REBUILD ONLINE; ``` ### 四、在线...

    ORACLE数据库碎片整理浅析.pdf

    REBUILD ONLINE)。 总结来说,Oracle数据库的碎片管理是数据库管理员日常维护的重要环节。通过对表空间、表和索引碎片的定期检测和有效整理,可以显著提升数据库的性能和响应速度。同时,使用更高效的表空间管理...

    Oracle索引检查重建与碎片收集[文].pdf

    ALTER INDEX index_name REBUILD ONLINE; ``` 除了索引重建,另一个处理碎片的方法是使用`ALTER TABLESPACE COALESCE`命令。这个命令用于整理表空间,将空闲的数据块合并,以减少空间的碎片。当你发现表空间的利用...

    ocp-052_(188Q)题库

    Rebuild the index using the ALTER INDEX...REBUILD ONLINE command. - **正确答案**。使用ALTER INDEX...REBUILD ONLINE命令可以在不影响在线用户的前提下重建索引,从而减少碎片化。 C. Change the block space...

    Oracle_OCA_1Z0-052认证题库

    Rebuild the index using the ALTER INDEX..REBUILD ONLINE command.**(正确答案) - 通过在线重建索引 (`ALTER INDEX..REBUILD ONLINE`) 可以有效地减少碎片化,同时不会影响当前正在使用该索引的用户。 - **C...

Global site tag (gtag.js) - Google Analytics