您的位置:首页 > 数据库 > Oracle

Oracle 交换分区

2016-04-24 21:42 405 查看
交换分区

利用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 类似。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: