首页 » ORACLE, ORACLE [C]系列 » Oracle 12c New Feature: Partition增强(二) online在线维护

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的分区表;
打赏

, ,

对不起,这篇文章暂时关闭评论。