Oracle 交换分区

交换分区
利用Oracle 交换分区你可以实现:

♦将一个分区(或子分区)转换成一个普通表。
♦将一个普通表转换成一个分区表的分区(或子分区)。
♦将一个哈希分区表转换成复合*哈希分区表的分区。
♦将一个复合*哈希分区表的分区转换成一个哈希分区表。
♦将一个(范围|列表)分区表转换成一个分区组合* 列表范围分区表。
♦将一个分区的复合*——(范围|列表)分区表转换到一个范围|列表分区表。

本文内容参考翻译自Oracle11G 在线文档http://docs.oracle.com/cd/E11882_01/server.112/e10837/part_admin002.htm#i1007620

可以指定INCLUDING INDEXES 来交换LOCAL 索引。
当指定WITHOUT VALIDATION交换分区操作,这通常是一个快速操作,因为它只涉及到数据字典更新。
当涉及的表和分区表有一个主键或是唯一性约束,那交换时执行WITH VALIDATION 来保证数据的完整性。
为了避免这种验证的开销,可以在交换分区之前执行:

ALTER TABLE table_name
     DISABLE CONSTRAINT constraint_name KEEP INDEX

待交换分区完成后在ENABLE约束。

交换一个 范围、HASH、列表分区到普通表

ALTER TABLE stocks
    EXCHANGE PARTITION p3 WITH TABLE stock_table_3;

1、交换一个间隔分区表

Oracle11g中一种新的分区类型很好的解决了这个问题–interval partition,它是传统范围分区的扩展,使得分区表的使用和维护更加灵活。

LOCK TABLE interval_sales
PARTITION FOR (TO_DATE('01-JUN-2007','dd-MON-yyyy'))
IN SHARE MODE;

ALTER TABLE interval_sales
EXCHANGE PARTITION FOR (TO_DATE('01-JUN-2007','dd-MON-yyyy'))
WITH TABLE interval_sales_jun_2007
INCLUDING INDEXES;

注意使用FOR系统生成的语法来识别一个分区。 分区的名称可以通过查询使用*_TAB_PARTITIONS数据字典视图来找出系统生成的分区名称。

示例:交换一个范围分区的分区到普通表

ALTER TABLE orders
EXCHANGE PARTITION p_2006_dec
WITH TABLE orders_dec_2006
UPDATE GLOBAL INDEXES;

ALTER TABLE order_items_dec_2006
ADD CONSTRAINT order_items_dec_2006_fk
FOREIGN KEY (order_id)
REFERENCES orders(order_id) ;

ALTER TABLE order_items
EXCHANGE PARTITION p_2006_dec
WITH TABLE order_items_dec_2006;

请注意,您必须使用UPDATE GLOBAL INDEXES或UPDATE INDEXES交换分区上的父表的主键索引仍然可用。 还请注意,您必须创建或允许的外键约束order_items_dec_2006表分区交换reference-partitioned表上的成功。

2、交换一个HASH分区表到复合HASH分区

首先,创建一个哈希分区表:

CREATE TABLE t1 (i NUMBER, j NUMBER)
     PARTITION BY HASH(i)
       (PARTITION p1, PARTITION p2);

填充表,然后创建一个range-hash分区表如下:

CREATE TABLE t2 (i NUMBER, j NUMBER)
     PARTITION BY RANGE(j)
     SUBPARTITION BY HASH(i)
        (PARTITION p1 VALUES LESS THAN (10)
            SUBPARTITION t2_pls1
            SUBPARTITION t2_pls2,
         PARTITION p2 VALUES LESS THAN (20)
            SUBPARTITION t2_p2s1
            SUBPARTITION t2_p2s2));

重要的是,t1表的分区键= t2表subpartitioning键。
在迁移数据t1来t2,并验证行,使用以下语句:
ALTER TABLE t2 EXCHANGE PARTITION p1 WITH TABLE t1
WITH VALIDATION;

3、交换一个复合HASH分区表的Subpartition

使用ALTER TABLE…EXCHANGE SUBPARTITION声明将 复合HASH 分区表 subpartition 交换到一个普通标,或相反。 下面的例子将sales表 subpartition q3_1999_s1 交换到 表 q3_1999。 本地索引分区与相应的索引q3_1999。

ALTER TABLE sales EXCHANGE SUBPARTITION q3_1999_s1
      WITH TABLE q3_1999 INCLUDING INDEXES;

4、交换一个列表分区到复合列表分区表

CREATE TABLE customers_apac
( id            NUMBER
, name          VARCHAR2(50)
, email         VARCHAR2(100)
, region        VARCHAR2(4)
, credit_rating VARCHAR2(1)
)
PARTITION BY LIST (credit_rating)
( PARTITION poor VALUES ('P')
, PARTITION mediocre VALUES ('C')
, PARTITION good VALUES ('G')
, PARTITION excellent VALUES ('E')
);

填充表 ,然后创建一个list-list分区表:

CREATE TABLE customers
( id            NUMBER
, name          VARCHAR2(50)
, email         VARCHAR2(100)
, region        VARCHAR2(4)
, credit_rating VARCHAR2(1)
)
PARTITION BY LIST (region)
SUBPARTITION BY LIST (credit_rating)
SUBPARTITION TEMPLATE
( SUBPARTITION poor VALUES ('P')
, SUBPARTITION mediocre VALUES ('C')
, SUBPARTITION good VALUES ('G')
, SUBPARTITION excellent VALUES ('E')
)
(PARTITION americas VALUES ('AMER')
, PARTITION emea VALUES ('EMEA')
, PARTITION apac VALUES ('APAC')
);

很重要的customers_apac表中的subpartitioning键相匹配customers表

ALTER TABLE customers
EXCHANGE PARTITION apac
WITH TABLE customers_apac
WITH VALIDATION;

5、交换一个子分区到复合列表分区表

使用 ALTER TABLE … EXCHANGE SUBPARTITION 与交换一个复合HASH分区表的Subpartition 类似。

6、交换一个范围分区表到复合范围分区表

CREATE TABLE orders_mar_2007
( id          NUMBER
, cust_id     NUMBER
, order_date  DATE
, order_total NUMBER
)
PARTITION BY RANGE (order_total)
( PARTITION p_small VALUES LESS THAN (1000)
, PARTITION p_medium VALUES LESS THAN (10000)
, PARTITION p_large VALUES LESS THAN (100000)
, PARTITION p_extraordinary VALUES LESS THAN (MAXVALUE)
);

创建一个interval-range分区表:

CREATE TABLE orders
( id          NUMBER
, cust_id     NUMBER
, order_date  DATE
, order_total NUMBER
)
PARTITION BY RANGE (order_date) INTERVAL (NUMTOYMINTERVAL(1,'MONTH'))
  SUBPARTITION BY RANGE (order_total)
  SUBPARTITION TEMPLATE
  ( SUBPARTITION p_small VALUES LESS THAN (1000)
  , SUBPARTITION p_medium VALUES LESS THAN (10000)
  , SUBPARTITION p_large VALUES LESS THAN (100000)
  , SUBPARTITION p_extraordinary VALUES LESS THAN (MAXVALUE)
  )
(PARTITION p_before_2007 VALUES LESS THAN (TO_DATE('01-JAN-2007','dd-
MON-yyyy')));

很重要的orders_mar_2007表中的subpartitioning键相匹配orders表

LOCK TABLE orders PARTITION FOR (TO_DATE('01-MAR-2007','dd-MON-yyyy')) 
IN SHARE MODE;

ALTER TABLE orders
EXCHANGE PARTITION
FOR (TO_DATE('01-MAR-2007','dd-MON-yyyy'))
WITH TABLE orders_mar_2007
WITH VALIDATION;

7、交换一个子分区到复合范围分区表

使用 ALTER TABLE…EXCHANGE SUBPARTITION 与交换一个复合HASH分区表的Subpartition 类似。

发表评论