Oracle 12c New Feature: Partition增强(二) online在线维护
随着数据的逐渐的增长, 在目前这个数据”爆炸式”增长的趋势下, 也许最初设计的非分区表需要转换为分区, 以前如果不停业务的话可以使用在线重定义, 但是在12c 中alter table增加了online clause, 在上篇记录了维护多分区的增强, 这篇继续记录12c在分区维护上的增强, 有没有遇到过需求把现有的非分区表转换为分区表, 同时需要考虑表上现有的索引, 又不停业务? 在12c 中成为现实.
— demo —
# 创建非分区表同时创建三个索引(位图\分区列在前\不含分区列)
create table anbob_t2 as select * from dba_Objects where object_id is not null; create index idx_oid on anbob_t2 ( object_id ); create index idx_ctime_oname on anbob_t2 ( created, object_name ); create bitmap index idx_b_otype on anbob_t2 (object_type); SQL> @ind anbob_t2 Display indexes where table or index name matches %anbob_t2%... TABLE_OWNER TABLE_NAME INDEX_NAME POS# COLUMN_NAME DSC ------------- ------------ ------------------- ---- ------------------------------ ---- ANBOB ANBOB_T2 IDX_B_OTYPE 1 OBJECT_TYPE IDX_CTIME_ONAME 1 CREATED 2 OBJECT_NAME IDX_OID 1 OBJECT_ID INDEX_OWNER TABLE_NAME INDEX_NAME IDXTYPE UNIQ STATUS PART TEMP H LFBLKS ------------- ------------ ------------------- ---------- ---- -------- ---- ---- -- ---------- ANBOB ANBOB_T2 IDX_B_OTYPE BITMAP NO VALID NO N 2 4 ANBOB_T2 IDX_CTIME_ONAME NORMAL NO VALID NO N 3 576 ANBOB_T2 IDX_OID NORMAL NO VALID NO N 2 171
# 转换当前表为分区以created字段, interval分区表
SQL> alter table anbob_t2 modify 2 partition by range (object_id) interval (10000) 3 ( 4 partition p1 values less than (20000) 5 ) online 6 update indexes 7 ( idx_oid local, 8 idx_ctime_oname global partition by range (created) 9 ( 10 partition ix2_p1 values less than (date '2014-08-01'), 11 partition ix2_p2 values less than (maxvalue) 12 ) 13 ); Table created. SQL> @tabpart anbob_t2 TABLE_OWNE TABLE_NAME POS COM PARTITION_NAME NUM_ROWS SUBPARTITION_COUNT HIGH_VALUE_RAW ---------- ------------ ---------- --- -------------------- ---------- ------------------ ------------------ ANBOB ANBOB_T2 1 NO P1 0 20000 ANBOB 2 NO SYS_P1498 0 30000 ANBOB 3 NO SYS_P1499 0 40000 ANBOB 4 NO SYS_P1500 0 50000 ANBOB 5 NO SYS_P1501 0 60000 ANBOB 6 NO SYS_P1502 0 70000 ANBOB 7 NO SYS_P1503 0 80000 7 rows selected. SQL> @ind anbob_t2 Display indexes where table or index name matches %anbob_t2%... TABLE_OWNER TABLE_NAME INDEX_NAME POS# COLUMN_NAME DSC ------------- ------------- -------------------- ---- ------------------------------ ---- ANBOB ANBOB_T2 IDX_B_OTYPE 1 OBJECT_TYPE IDX_CTIME_ONAME 1 CREATED 2 OBJECT_NAME IDX_OID 1 OBJECT_ID INDEX_OWNER TABLE_NAME INDEX_NAME IDXTYPE UNIQ STATUS PART TEMP H LFBLKS ------------- ------------- -------------------- ---------- ---- -------- ---- ---- -- ---------- ANBOB ANBOB_T2 IDX_B_OTYPE BITMAP NO N/A YES N 2 8 ANBOB_T2 IDX_CTIME_ONAME NORMAL NO N/A YES N 3 619 ANBOB_T2 IDX_OID NORMAL NO N/A YES N 2 174
Note:
一条命令把原分区表转换成了分区表,同时列上的索引还保护有效, 上面使用了ONLINE关键字, 当然除了这里在线非分区转换分区外, 分区表也可以online MOVE, 这个特性就不再演示了.
上面的命令中还使用了update indexes 选项, 可以使用local, global选项指定现有的索引创建成对应的local还是global分区; 如果只带了update index ,没有指写local 或global选项就像上面的位图索引, ORACLE有自己的索引转换规则:
原Nonprefixed索引保留着原来的特性,如非分区,全局分区索引都不改变; 原Prefixed索引转换为LOCAL索引; 位图索引转换为local索引,无论是否是prefixed索引.
有一些限制以下的表不支持:
不能指定该选项对于IOT table; domain index存在的表; 不能转换非分区表为11g引入的reference-partitioned的分区表;
对不起,这篇文章暂时关闭评论。