Oracle - Exchange子分区

时间:2015-11-12 14:28:57

标签: sql oracle database-partitioning

给出两个相同的表(CUSTOMER和CUSTOMER_TMP),其中包含以下示例结构:

create table customer(
customer_id number,
customer_name varchar2(400),
churn_flag number, -- 0 or 1 
active number  -- 0 or 1
)
PARTITION BY LIST (ACTIVE)
SUBPARTITION BY LIST (churn_flag)
( PARTITION p_active_1 values (1)
  ( SUBPARTITION sp_churn_flag_11 VALUES (1)
  , SUBPARTITION sp_churn_flag_10 VALUES (0)
  )
,
 PARTITION p_active_0 values (0)
  ( SUBPARTITION sp_churn_flag_01 VALUES (1)
  , SUBPARTITION sp_churn_flag_00 VALUES (0)
  )
);

这些表由ACTIVE-flag(0或1)分区,而每个相应的分区都使用另一个标志CHURN-flag进行子分区,该标志也可以是0或1.

首先使用数据填充CUSTOMER_TMP。然后,CQUOMER将由EXCHANGE PARTITONS功能填充。

我的问题:

通过以下语句执行该操作是否保存:

alter table customer exchange partition p_active_1 with table customer_tmp without validation;
alter table customer exchange partition p_active_0 with table customer_tmp without validation;

或者我是否必须单独交换每个子部分或者换句话说:交换分区是否会安全地交换基础子分区?

1 个答案:

答案 0 :(得分:1)

您可以分区填充表格。为此,请使用与CUSTOMER表的子部分对应的分区结构定义一个表

 create table customer_tmp_act(
 customer_id number,
 customer_name varchar2(400),
 churn_flag number, -- 0 or 1 
 active number  -- 0 or 1
 )
 PARTITION BY LIST (churn_flag)
   (PARTITION sp_churn_flag_01 VALUES (1)
   , PARTITION sp_churn_flag_00 VALUES (0)
   )
 ;

我正在调用表格customer_tmp_act,以表明它只包含有效记录active = 1

向所有活跃客户填写表格,请注意TMP表格的分区将根据客户流失的价值进行核心填充。

实施例

insert into customer_tmp_act values (111,'xxx',0,1);   
insert into customer_tmp_act values (111,'xxx',1,1);
commit;

交换前的状态

临时表,每行有两个分区。

CUSTOMER表是空的。

比使用

 alter table customer exchange partition p_active_1 with table customer_tmp_act without validation;

将CUSTOMER表的分区与TMP表交换。 TMP表的所有分区都成为CUSTOMER表的SUBPARTITION。

交换后的状态

临时表为空,CUSTOMER表活动分区,两个子分区都已填充

您可以使用

进行验证
 select * from customer SUBPARTITION (sp_churn_flag_11);
 select * from customer SUBPARTITION (sp_churn_flag_10); 

注意您有责任(使用无验证)在TMP表中提供正确的ACTIVE值 - 因为您将验证更新为Oracle。否则,您会在错误的分区中以错误的数据结束。

对于不活跃的客户重复此过程,您可以重复使用相同的TMP表,但这次所有记录必须再次具有active = 0.

另请注意,在此架构中,如果在交换之前CUSTOMER表不为空,则将丢失数据。来自CUSTOMER的数据在交换后存储在TMP表中。

<强>疑难解答

EXCHANGE PARTITION中的一个警告是列定义的差异 导致ORA-14097: column type or size mismatch in ALTER TABLE EXCHANGE PARTITION

使用以下查询,它必须为两个表提供完全相同的结果:

 select   COLUMN_ID, COLUMN_NAME, DATA_TYPE, DATA_LENGTH, DATA_PRECISION, NULLABLE 
 from user_tab_columns where table_name = 'CUSTOMER' order by column_id;