本章节介绍了如何为Oracle表和索引进行分区和子分区的维护操作。本章节包含以下主题:
- 在分区上可以执行的维护操作
- 自动更新索引
- 添加分区
- 合并分区
- 删除分区
- 交换分区
- 合并分区
- 修改默认属性
- 修改分区的当前属性
- 修改列表分区:增加值
- 修改列表分区:删除值
- 修改子分区模板
- 移动分区
- 在线重定义分区
- 重建索引分区
- 重命名分区
- 分割分区
- 截断分区
注意:以下各节讨论分区表的维护操作,这些维护操作会影响到索引或索引分区的可用性,考虑以下几点:
- 只有非空的索引和索引分区才可能被标识为UNUSABLE。如果他们是空的,USABLE/UNUSABLE状态保持不变。
- 只有状态为可用(USABLE)的索引或索引分区可以被后续的DML更新。
在分区上可以执行的维护操作
表4-1列出了可以对分区表和复合分区表进行的维护操作,表4-2列出子分区维护操作可以对分区表进行复合。对于每种类型的分区和分区,都列出了维护操作中用到的ALTER TABLE语句的具体子句。表4-1分区表的ALTER TABLE维护操作
| 维护操作 | 范围复合Range-* | 间隔复合Interval-* | 哈希 | 列表复合List-* | 引用 |
| 添加分区 | ADD PARTITION | ADD PARTITION | ADD PARTITION | ADD PARTITION | N/A |
| 合并分区 | N/A | N/A | COALESCE PARTITION | N/A | N/A |
| 删除分区 | DROP PARTITION | DROP PARTITION | N/A | DROP PARTITION | N/A |
| 交换分区 | EXCHANGE PARTITION | EXCHANGE PARTITION | EXCHANGE PARTITION | EXCHANGE PARTITION | EXCHANGE PARTITION |
| 合并分区 | MERGE PARTITIONS | MERGE PARTITIONS | N/A | MERGE PARTITIONS | N/A |
| 修改默认属性 | MODIFY DEFAULT ATTRIBUTES | MODIFY DEFAULT ATTRIBUTES | MODIFY DEFAULT ATTRIBUTES | MODIFY DEFAULT ATTRIBUTES | MODIFY DEFAULT ATTRIBUTES |
| 修改分区的当前属性 | MODIFY PARTITION | MODIFY PARTITION | MODIFY PARTITION | MODIFY PARTITION | MODIFY PARTITION |
| 修改列表分区:增加值 | N/A | N/A | N/A | MODIFY PARTITION ... ADD VALUES | N/A |
| 修改列表分区:删除值 | N/A | N/A | N/A | MODIFY PARTITION ... DROP VALUES | N/A |
| 移动分区 | MOVE SUBPARTITION | MOVE SUBPARTITION | MOVE PARTITION | MOVE SUBPARTITION | MOVE PARTITION |
| 重命名分区 | RENAME PARTITION | RENAME PARTITION | RENAME PARTITION | RENAME PARTITION | RENAME PARTITION |
| 分割分区 | SPLIT PARTITION | SPLIT PARTITION | N/A | SPLIT PARTITION | N/A |
| 截断分区 | TRUNCATE PARTITION | TRUNCATE PARTITION | TRUNCATE PARTITION | TRUNCATE PARTITION | TRUNCATE PARTITION |
表4-2子分区表的ALTER TABLE维护操作
| 维护操作 | 复合*-Range | 复合*-Hash | 复合*-List |
| 添加分区 | MODIFY PARTITION ... ADD SUBPARTITION | MODIFY PARTITION ... ADD SUBPARTITION | MODIFY PARTITION ... ADD SUBPARTITION |
| 合并分区 | N/A | MODIFY PARTITION ... COALESCE SUBPARTITION | N/A |
| 删除分区 | DROP SUBPARTITION | N/A | DROP SUBPARTITION |
| 交换分区 | EXCHANGE SUBPARTITION | N/A | EXCHANGE SUBPARTITION |
| 合并分区 | MERGE SUBPARTITIONS | N/A | MERGE SUBPARTITIONS |
| 修改默认属性 | MODIFY DEFAULT ATTRIBUTES FOR PARTITION | MODIFY DEFAULT ATTRIBUTES FOR PARTITION | MODIFY DEFAULT ATTRIBUTES FOR PARTITION |
| 修改分区的当前属性 | MODIFY SUBPARTITION | MODIFY SUBPARTITION | MODIFY SUBPARTITION |
| 修改列表分区:增加值 | N/A | N/A | MODIFY SUBPARTITION ... ADD VALUES |
| 修改列表分区:删除值 | N/A | N/A | MODIFY SUBPARTITION ... DROP VALUES |
| 修改子分区模板 | SET SUBPARTITION TEMPLATE | SET SUBPARTITION TEMPLATE | SET SUBPARTITION TEMPLATE |
| 移动分区 | MOVE SUBPARTITION | MOVE SUBPARTITION | MOVE SUBPARTITION |
| 重命名分区 | RENAME SUBPARTITION | RENAME SUBPARTITION | RENAME SUBPARTITION |
| 分割分区 | SPLIT SUBPARTITION | N/A | SPLIT SUBPARTITION |
| 截断分区 | TRUNCATE SUBPARTITION | TRUNCATE SUBPARTITION | TRUNCATE SUBPARTITION |
注意:当您第一次使用表压缩,将压缩分区引入一个包含位图索引并且只包含未压缩分区的分区表,你必须做到以下几点:
- 删除所有现存的位图索引和位图分区索引,或者将它们标识为UNUSABLE;
- 设置表压缩属性
- 重建索引
分区是否包含数据,和引入压缩分区的操作是相互独立的。另外,这并不适用于包含B-tree索引的分区表以及分区索引组织表。表4-3列出了可以对索引分区进行的维护操作,并指出可以操作的索引类型(全局或局部)。而且,还列出了用于维护操作的ALTER INDEX子句。全局索引并不反映基表的结构。如果分区,它们可通过范围或散列进行分区。全局分区索引可以共享在分区表上的部分操作,而不是全部。由于本地索引反映了基表的结构,在对分区或者子分区进行维护操作时,索引分区会自动被维护。因此,维护本地索引分区的必要性大打折扣,并且相应的选项也很少。表4-3 索引分区的ALTER INDEX维护操作
| 维护操作 | 索引类型 | 索引分区类型 |
| 范围 | 哈希和列表 | 复合 |
| 添加索引分区 | Global | - | ADD PARTITION (hash only) | - |
| | Local | N/A | N/A | N/A |
| 删除索引分区 | Global | DROP PARTITION | - | - |
| | Local | N/A | N/A | N/A |
| 修改索引分区的默认属性 | Global | MODIFY DEFAULT ATTRIBUTES | - | - |
| | Local | MODIFY DEFAULT ATTRIBUTES | MODIFY DEFAULT ATTRIBUTES | MODIFY DEFAULT ATTRIBUTESMODIFY DEFAULT ATTRIBUTES FOR PARTITION |
| 修改索引分区的当前属性 | Global | MODIFY PARTITION | - | - |
| | Local | MODIFY PARTITION | MODIFY PARTITION | MODIFY PARTITIONMODIFY SUBPARTITION |
| 重建索引分区 | Global | REBUILD PARTITION | - | - |
| | Local | REBUILD PARTITION | REBUILD PARTITION | REBUILD SUBPARTITION |
| 重命名索引分区 | Global | RENAME PARTITION | - | - |
| | Local | RENAME PARTITION | RENAME PARTITION | RENAME PARTITIONRENAME SUBPARTITION |
| 分割索引分区 | Global | SPLIT PARTITION | - | - |
| | Local | N/A | N/A | N/A |
自动更新索引
在讨论针对分区表和索引的各个维护操作之前,讨论一下可以在ALTER TABLE语句中指定的UPDATE INDEXES子句的影响,是十分重要的。默认情况下,分区表上的很多维护操作都会使相关的索引或索引分区无效(标识为)UNUSABLE。你必须重建整个索引,或者对于一个全局索引,或者对于每一个分区索引。如果你在ALTER TABLE语句中指定了UPDATE INDEXES子句,数据库会默认这行这些操作。指定UPDATE INDEXES子句会告诉数据库当执行DDL维护操作时的同时去更新索引。这提供了以下优点:
- 索引更新与基表操作时同步的,不需要你以后手动更新和单独重建索引
- 全局索引的高可用性,因为他们没有被标识为UNUSABLE,当执行分区表的DDL操作时,这些索引仍是可用的,并且你可以访问那些不受影响的分区表。
- 你不必查找所有无效索引的名字来重建他们。
在更新本地索引及其分区时,你可以通过可选子句来指定物理和存储特性。你可以为每个本地索引的每个分区指定物理特性、表空间存储以及日志特性。或者,你可以只指定PARTITION关键字,让数据库按照以下原则来更新分区特性:
- 对于单个表分区操作(如移动分区和分割分区),相应的索引分区继承了受影响的索引分区的特性。数据库不会生成新的索引分区名称,所以这个操作生成的新的索引分区以及相应的新的表分区都会继承他们原来的名字。
- 对于合并分区操作,新生成的本地分区索引从新生成的表分区那里继承名称,并且从本地索引中继承其特性。
- 对于复合分区索引,你可以为每个子分区指定表空间存储特性。
以下子句可以指定UPDATE INDEXES子句:
- ADD PARTITION | SUBPARTITION
- COALESCE PARTITION | SUBPARTITION
- DROP PARTITION | SUBPARTITION
- EXCHANGE PARTITION | SUBPARTITION
- MERGE PARTITION | SUBPARTITION
- MOVE PARTITION | SUBPARTITION
- SPLIT PARTITION | SUBPARTITION
- TRUNCATE PARTITION | SUBPARTITION
SKIP_UNUSABLE_INDEXES初始化参数
SKIP_UNUSABLE_INDEXES是默认设置为TRUE的初始化参数。当索引或者索引分区被标识为UNUSABLE时,该设置禁止由此产生的错误报告。如果你不希望数据库选择其他的执行计划,以避免无法使用的索引,那么你应该将此参数设置为FALSE。
自动更新索引的注意事项
当指定UPDATE INDEXES子句时,需要注意以下事项:分区DDL语句需要更长的时间来执行,因为先前标记为UNUSABLE的索引需要进行更新。尽管如此,你必须比较它与与执行DDL操作然后重新生成所有索引的时间。一个经验法则是,如果该分区的大小小于该表大小的5%,自动更新索引还是相对较快的。删除、阶段和交换操作不再是快速操作,同样的,你需要比较一下二者的时间。当你更新包含全局索引的表时:索引被更新,同时更新操作生成日志记录,并产生redo和undo日志。相反,如果你重建整个全局索引,你可以在NOLOGGING模式下进行操作。手动重建整个索引将会生成一个更有效的索引,因为它更紧凑,提高空间利用率。索引组织表不支持UPDATE INDEXES子句。但是,为了保持索引组织表的全局索引的可用性,在执行删除分区、截断分区和交换分区操作时,需要指定UPDATE GLOBAL INDEXES子句。对于上述列表中的其余操作,索引组织表的全局索引保持可用。此外,索引组织表的本地索引分区在执行MOVE PARTITION操作之后仍然可用。更多Oracle相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12
本文永久更新链接地址