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