【问题标题】:ORACLE - Partitioning with changing valuesORACLE - 使用不断变化的值进行分区
【发布时间】:2015-07-24 11:22:51
【问题描述】:

假设下表:

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)
  )
)

出于性能原因,该表应获得“复合列表-列表”分区,请参阅http://docs.oracle.com/cd/E18283_01/server.112/e16541/part_admin001.htm#i1006565

问题在于,对于大量记录,ACTIVE-Flag 会经常更改,有时 B2B_FLAG 也会更改。 Oracle 会自动识别分区值已更改的记录并将它们移动到适当的分区,还是我必须调用某种维护函数来重新组织分区?

【问题讨论】:

    标签: oracle partitioning database-administration database-partitioning


    【解决方案1】:

    您需要在表上启用行移动,否则更新语句将失败并显示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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-31
      • 2021-10-01
      • 1970-01-01
      • 2017-09-22
      • 2011-01-18
      • 1970-01-01
      • 1970-01-01
      • 2019-01-10
      相关资源
      最近更新 更多