交换分区
利用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;
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表上的成功。
首先,创建一个哈希分区表:
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;
使用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;
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;
使用 ALTER TABLE … EXCHANGE SUBPARTITION 与交换一个复合HASH分区表的Subpartition 类似。
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;
使用 ALTER TABLE…EXCHANGE SUBPARTITION 与交换一个复合HASH分区表的Subpartition 类似。