给出两个相同的表(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;
或者我是否必须单独交换每个子部分或者换句话说:交换分区是否会安全地交换基础子分区?
答案 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;