移动索引
移动索引是在原始表空间或另一个表空间中重建整个索引,并带有一些选项,如ONLINE或PARALLEL。事实上,Oracle 中重建索引在数据库管理方面有一些优势:
- 对松弛索引进行碎片整理
- 离开拥挤的表空间
这可以减小索引的大小,并可以在查询期间加快索引扫描。
这可能会从拥挤的表空间中释放一些空间,以防止表出现 ORA-01653或索引出现 ORA-01654。
假设我们想通过ALTER INDEX语法重建名为OE.ORDER_PK的索引,该索引当前位于EXAMPLE表空间中。
SQL> conn oe/oe@orcl
Connected.
SQL> select tablespace_name from user_indexes where index_name = 'ORDER_PK';
TABLESPACE_NAME
------------------------------
EXAMPLE在这篇文章中,我介绍了 5 种移动索引的不同方法。
- 重建相同的表空间
- 重建另一个表空间
- 在线重建
- 并行重建
- 重建 NOLOGGING
1. 改变索引重建
如果要在同一个表空间中重建索引,则不必指定表空间子句。
SQL> alter index ORDER_PK rebuild;
Index altered.
SQL> select tablespace_name from user_indexes where index_name = 'ORDER_PK';
TABLESPACE_NAME
------------------------------
EXAMPLE在原始表空间中重建索引的唯一目的是碎片整理。您最好确保有足够的可用空间,至少是当前表空间大小的两倍,然后再执行此操作。
2. ALTER INDEX 重建表空间
您需要指定表空间子句才能将索引移出原始位置。
SQL> alter index ORDER_PK rebuild tablespace USERS;
Index altered.
SQL> select tablespace_name from user_indexes where index_name = 'ORDER_PK';
TABLESPACE_NAME
------------------------------
USERS3. 在线更改索引重建
从 Oracle 10g 开始,我们可以使用ONLINE选项移动索引,这意味着在重建索引期间允许执行数据操作语言 (DML) 。
SQL> alter index ORDER_PK rebuild tablespace USERS online;
Index altered.ONLINE选项并不意味着重建索引不需要锁定任何对象,它只是锁定表,然后在最后阶段在很短的时间内释放它。
注意,ALTER INDEX中的REBUILD关键字不能在 tablespace 子句之后指定。
4. ALTER INDEX REBUILD PARALLEL
我们可以并行重建索引。
SQL> alter index ORDER_PK rebuild tablespace USERS online parallel 16;
Index altered.但这也改变了索引的并行度。
SQL> select degree from user_indexes where index_name = 'ORDER_PK';
DEGREE
----------------------------------------
16如果与索引相关的任何 SQL 执行路径受到影响或更糟,您可以像这样将其还原。
SQL> alter index ORDER_PK noparallel;
Index altered.
SQL> select degree from user_indexes where index_name = 'ORDER_PK';
DEGREE
----------------------------------------
15.重建NOLOGGING
如果数据库没有理由保留索引的重做日志,或者它当前处于NOARCHIVELOG模式。如果索引真的很大,我们可以通过减少在线日志来加速重建。
顺便问一下,你知道如何检查归档日志模式吗?
SQL> alter index ORDER_PK rebuild tablespace USERS online nologging;
Index altered.同样,NOLOGGING将索引的属性从LOGGING永久更改为NOLOGGING。
SQL> select logging from user_indexes where index_name = 'ORDER_PK';
LOG
---
NO要将其恢复正常,您可以这样做:
SQL> alter index ORDER_PK logging;
Index altered.
SQL> select logging from user_indexes where index_name = 'ORDER_PK';
LOG
---原文标题:Alter Index Rebuild to Another Tablespace
原文作者:Ed Chen
原文链接:https://logic.edchen.org/how-oracle-move-index/
YES



