交换水平分区

使用交换分区时,应注意以下规则:

  • 交换分区操作可以交换表与索引的段,操作中并不需要相互拷贝数据,只需交换段的信息即可。
  • 如果交换的两个表中,任何一个表含有约束,则不能进行交换。
  • 交换数据的表,那么它们的表结构,分区键和分区键值,都必须相同。当范围、列表或哈希分区表与复合分区表的一级子分区表交换时,子分区表的个数也必须相同。
  • 交换过程中两个对象的segement的属性会被完全交换,包括表空间与日志。
  • 当交换过后,所有基于交换对象的全局索引都将失效,可以使用update_global_index_clause来更新全局索引。
  • 如果不含有INCLUDING/EXCLUDING INDEXES关键字,默认不交换局部分区索引。如果不交换索引,那么进行交换操作的子分区表相关联的局部子分区索引被置为失效状态,并且标记局部主分区索引为失效。
  • 如果含有INCLUDING INDEXES关键字,需要交换局部分区索引,那么索引的个数,以及索引的索引键都必须相同。交换后局部分区索引都有效,而全局索引都将失效。
  • 如果含有EXCLUDING INDEXES关键字,不需要交换局部分区索引,全局分区索引、全局非分区索引和局部分区索引都处于失效状态。
  • 交换的两个子分区表的如果存在列曾经被删除过,那么被删除的列号也必须相同。
  • 分区表不能和临时表交换。
  • 如果含有WITH VALIDATION关键字,表示在进行交换时,会验证数据的正确性,查看数据是否满足交换后的分区条件,而含有WITHOUT VALIDATION则不进行检查。默认情况同WITH VALIDATION。

示例:交换水平分区

使用ALTER TABLE … EXCHANGE PARTITION语句交换范围,哈希,列表分区。下面的语句交换分区到一个非分区表中。tab2表可以是范围,哈希或列表分区

--  清理环境
DROP TABLE tab1 CASCADE;
DROP TABLE tab2 CASCADE;


CREATE TABLE tab1
( 
    id NUMERIC,
    region VARCHAR(4),
    credit_rating VARCHAR(1)
)
PARTITION BY LIST (credit_rating)
( 
    PARTITION poor VALUES ('P'),
    PARTITION mediocre VALUES ('C'),
    PARTITION good VALUES ('G'),
    PARTITION excellent VALUES ('E')
);


CREATE TABLE tab2
( 
    id NUMERIC,
    region VARCHAR(4),
    credit_rating VARCHAR(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')
);

ALTER TABLE tab2 EXCHANGE PARTITION apac WITH TABLE tab1 WITH VALIDATION;

--  删除表和表空间
DROP TABLE tab1 CASCADE;
DROP TABLE tab2 CASCADE;