ORACLE - 使用变化的值进行分区
ORACLE - Partitioning with changing values
假设以下 table:
create table INVOICE(
INVOICE_ID NUMBER
,INVOICE_SK NUMBER
,INVOICE_AMOUNT NUMBER
,INVOICE_TEXT VARCHAR2(4000 Char)
,B2B_FLAG NUMBER -- 0 or 1
,ACTIVE NUMBER(1) -- 0 or 1
)
PARTITION BY LIST (ACTIVE)
SUBPARTITION BY LIST (B2B_FLAG)
( PARTITION p_active_1 values (1)
( SUBPARTITION sp_b2b_flag_11 VALUES (1)
, SUBPARTITION sp_b2b_flag_10 VALUES (0)
)
,
PARTITION p_active_0 values (0)
( SUBPARTITION sp_b2b_flag_01 VALUES (1)
, SUBPARTITION sp_b2b_flag_00 VALUES (0)
)
)
出于性能原因,table 应该进行 "Composite List-List" 分区,请参阅 http://docs.oracle.com/cd/E18283_01/server.112/e16541/part_admin001.htm#i1006565。
问题在于,ACTIVE-Flag 会针对大量记录频繁更改,有时 B2B_FLAG 也会更改。 Oracle 会自动识别分区值已更改的记录并将它们移动到适当的分区,还是我必须调用某种维护函数才能重新组织分区?
您需要在 table 上启用行移动,否则更新语句将失败 ORA-14402: updating partition key column would cause a partition change
。
查看以下测试用例:
create table T_TESTPART
(
pk number(10),
part_key number(10)
)
partition by list (part_key) (
partition p01 values (1),
partition p02 values (2),
partition pdef values (default)
);
alter table T_TESTPART
add constraint pk_pk primary key (PK);
现在插入一行并尝试更新分区值:
insert into t_testpart values (1,1);
update t_testpart set part_key = 2 where pk = 1;
您现在将收到上述错误。
如果您启用行移动,相同的语句将起作用并且 oracle 会将行移动到另一个分区:
alter table t_testpart enable row movement;
update t_testpart set part_key = 2 where pk = 1;
我没有做任何性能测试,但Oracle 可能会将行从第一个分区中删除并将其插入到第二个分区中。大规模使用时请考虑这一点。
在我自己的数据库中,我通常只在不会改变的列上使用分区。
延伸阅读:
http://www.dba-oracle.com/t_callan_oracle_row_movement.htm
假设以下 table:
create table INVOICE(
INVOICE_ID NUMBER
,INVOICE_SK NUMBER
,INVOICE_AMOUNT NUMBER
,INVOICE_TEXT VARCHAR2(4000 Char)
,B2B_FLAG NUMBER -- 0 or 1
,ACTIVE NUMBER(1) -- 0 or 1
)
PARTITION BY LIST (ACTIVE)
SUBPARTITION BY LIST (B2B_FLAG)
( PARTITION p_active_1 values (1)
( SUBPARTITION sp_b2b_flag_11 VALUES (1)
, SUBPARTITION sp_b2b_flag_10 VALUES (0)
)
,
PARTITION p_active_0 values (0)
( SUBPARTITION sp_b2b_flag_01 VALUES (1)
, SUBPARTITION sp_b2b_flag_00 VALUES (0)
)
)
出于性能原因,table 应该进行 "Composite List-List" 分区,请参阅 http://docs.oracle.com/cd/E18283_01/server.112/e16541/part_admin001.htm#i1006565。
问题在于,ACTIVE-Flag 会针对大量记录频繁更改,有时 B2B_FLAG 也会更改。 Oracle 会自动识别分区值已更改的记录并将它们移动到适当的分区,还是我必须调用某种维护函数才能重新组织分区?
您需要在 table 上启用行移动,否则更新语句将失败 ORA-14402: updating partition key column would cause a partition change
。
查看以下测试用例:
create table T_TESTPART
(
pk number(10),
part_key number(10)
)
partition by list (part_key) (
partition p01 values (1),
partition p02 values (2),
partition pdef values (default)
);
alter table T_TESTPART
add constraint pk_pk primary key (PK);
现在插入一行并尝试更新分区值:
insert into t_testpart values (1,1);
update t_testpart set part_key = 2 where pk = 1;
您现在将收到上述错误。 如果您启用行移动,相同的语句将起作用并且 oracle 会将行移动到另一个分区:
alter table t_testpart enable row movement;
update t_testpart set part_key = 2 where pk = 1;
我没有做任何性能测试,但Oracle 可能会将行从第一个分区中删除并将其插入到第二个分区中。大规模使用时请考虑这一点。 在我自己的数据库中,我通常只在不会改变的列上使用分区。
延伸阅读: http://www.dba-oracle.com/t_callan_oracle_row_movement.htm