Oracle - Exchange 子分区

Oracle - Exchange child partitions

给定两个具有以下示例结构的相同表(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 标志(0 或 1)分区,而每个相应的分区由另一个标志 CHURN 标志(也可以是 0 或 1)进行子分区。

CUSTOMER_TMP 首先填充数据。然后 CUSTOMER 将由 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;

或者我是否必须单独交换每个子分区,或者换句话说:交换分区是否也会自动安全地交换底层子分区?

您可以按分区填充 table。为此,定义一个 table,其分区结构对应于 CUSTOMER table

的子分区
 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)
   )
 ;

我正在调用 table customer_tmp_act 强调它只包含活动记录 active = 1

用所有活跃客户填充 table,请注意 TMP 的分区 table 将根据流失值正确填充。

例子

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

兑换前状态

临时 table 有两个分区,每一行。

CUSTOMER table 为空。

比使用

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

与 TMP table 交换 CUSTOMER table 的分区。 TMP table 的所有分区都变成了 CUSTOMER table 的子分区。

交换后状态

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

你可以用

验证一下
 select * from customer SUBPARTITION (sp_churn_flag_11);
 select * from customer SUBPARTITION (sp_churn_flag_10); 

注意您有责任(因为使用未经验证)在 TMP table 中提供正确的 ACTIVE 值- 当您禁用 Oracle 验证时。否则你会在错误的分区中得到错误的数据。

对不活跃的客户重复该过程,您可以重复使用相同的 TMP table,但这次所有记录都必须有 active = 0。

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

疑难解答

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

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

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