12c在线调整表为分区表

在以前的版本中,如果需要将一个非分区表变成分区表,一般是通过以下几种方式

  • EXCHANGE PARTITION
  • DBMS_REDEFINITION
  • DATAPUMP

其中前两种属于在线的方式,操作起来相对繁琐,步骤也比较多。而到了12.2版本中,提供了一种更方便的办法,只需要一个命令即可在线完成这个操作。

新建一张非分区表

drop table t1 purge;

create table t1 (id number,name varchar2(20));

insert into t1 
select level,'name:'||level from dual
connect by level<=1000;

commit;

create index idx_t1 on t1(id);

将t1表变更为分区表,通过ALTER TABLE XXX MODIFY命令,默认是OFFLINE,如果指定ONLINE,则在modify的过程中表是可以允许DML操作的。

默认的offline

sys@ORA12C> alter table t1 modify 
partition by range(id) interval (200)
(partition p1 values less than (200),
partition p2 values less than (400));

Table altered.

加上online在线并同时更新索引

alter table t1 modify 
partition by range(id) interval (200)
(partition p1 values less than (200),
partition p2 values less than (400)) online                 <<<<====online关键字
update indexes 
(idx_t1 global partition by range(id)
(partition ip1 values less than (maxvalue))
);

检查新生成的分区以及分区索引

col table_name for a30
col partition_name for a50
select table_name,partition_name from dba_tab_partitions where table_name='T1';

TABLE_NAME                     PARTITION_NAME
------------------------------ --------------------------------------------------
T1                             P1
T1                             P2
T1                             SYS_P381             <<<<====后面的名字都为系统自动生成
T1                             SYS_P382
T1                             SYS_P383
T1                             SYS_P384


col index_name for a30
col partition_name for a50
select index_name,partition_name,status from dba_ind_partitions where INDEX_NAME ='IDX_T1';

INDEX_NAME                     PARTITION_NAME                                     STATUS
------------------------------ -------------------------------------------------- --------
IDX_T1                         IP1                                                USABLE

当使用UPDATE INDEXES时,要注意以下信息

  • 这个子句可以用来更改需要变更索引的分区状态和存储信息
  • UPDATE INDEXES子句是可选项,无论是ONLINE还是OFFLINE都会对转换的索引进行维护
  • 不能更改定义原始索引列表的列
  • 如果所有索引都未指定表空间,则会默认应用以下表空间
    • 转换后的本地索引与分区一样
    • 转换后的全局索引与转换之前的非分区表全局索引表空间一样
  • 如果没有指定INDEX子句,或者INDEX子句未包含原非分区表中所有的索引,则转换后的未指定索引遵循以下原则
    • 全局分区索引保持不变,保持原始分区形态
    • 无前缀的索引变成全局非分区索引
      前缀表示分区字段包含在索引内,但是组成索引的字段并非分区键一个
    • 位图索引变成本地分区索引,而不管它们是否有前缀
      位图索引必须一直是本地分区索引
  • 这个转换不适用含有域索引的表

发表评论