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;
给定两个具有以下示例结构的相同表(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;