【问题标题】:Oracle Archive and Purge OptionsOracle 归档和清除选项
【发布时间】:2020-05-27 02:14:43
【问题描述】:

鉴于我们的情况,我正在尝试找出执行存档和清除的最佳选项。

我们在表 A 中大约有 5000 万条记录。我们希望将数据归档到目标表中,然后清除源表中的这些数据。我们希望根据相互重叠的几个标准保留数据库。例如,我们希望保留过去 5 个月的数据,同时保留所有的记录,比如 Indicator='True'。 Indicator='True' 可能会返回超过 5 个月的记录。这意味着我必须使用 OR 条件来捕获数据。根据条件,我们需要保留 1000 万条记录归档/清除 4000 万条记录。我需要创建一个每 6 个月运行一次的流程来执行此操作。

我的问题是,对于我来说,完成归档和清除工作的最有效的选项是什么? PROC/批量删除/插入会是我的最佳选择吗?

分区似乎是不可能的,因为有几个条件相互重叠。

【问题讨论】:

    标签: oracle performance bulk-operations


    【解决方案1】:

    使用composite partitioning,例如range(用于您的时间维度)和 list(用于区分应该保持较长时间和有限时间的行。

    示例

    KEEP_ID='N' 的行应在 5 个月后删除。

    CREATE TABLE tab
      ( id            NUMBER(38,0),
        trans_dt      DATE,
        keep_id       VARCHAR2(1)
      )
     PARTITION BY RANGE (trans_dt) INTERVAL (NUMTOYMINTERVAL(1,'MONTH'))
     SUBPARTITION BY LIST (keep_id)
       SUBPARTITION TEMPLATE
       ( SUBPARTITION p_catalog VALUES ('Y'),
         SUBPARTITION p_internet VALUES ('N')
       )
     (PARTITION p_init VALUES LESS THAN (TO_DATE('01-JAN-2019','dd-MON-yyyy'))
      );
    

    用 6 个月的样本数据填充

    insert into tab (id, trans_dt, keep_id)
    select rownum, add_months(date'2019-08-01', trunc((rownum-1) / 2)), decode(mod(rownum,2),0,'Y','N') 
    from dual connect by level <= 12;
    
    select * from tab
    order by trans_dt, keep_id; 
    
            ID TRANS_DT            KEEP_ID
    ---------- ------------------- -------
             1 01.08.2019 00:00:00 N       --- this subpartition should be deleted
             2 01.08.2019 00:00:00 Y       
             3 01.09.2019 00:00:00 N       
             4 01.09.2019 00:00:00 Y       
             5 01.10.2019 00:00:00 N       
             6 01.10.2019 00:00:00 Y       
             7 01.11.2019 00:00:00 N       
             8 01.11.2019 00:00:00 Y       
             9 01.12.2019 00:00:00 N       
            10 01.12.2019 00:00:00 Y       
            11 01.01.2020 00:00:00 N       
            12 01.01.2020 00:00:00 Y 
    

    现在使用partition extended names 来引用应该删除的子分区。

    删除超过 5 个月的子分区,但仅适用于 KEEP_ID = 'N'

     alter table tab drop subpartition for (DATE'2019-08-01','N');   
    

    新数据

            ID TRANS_DT            KEEP_ID
    ---------- ------------------- -------
             2 01.08.2019 00:00:00 Y       
             3 01.09.2019 00:00:00 N       
             4 01.09.2019 00:00:00 Y   
    .....
    

    【讨论】:

      猜你喜欢
      • 2014-05-05
      • 2015-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-08
      • 2016-03-03
      • 1970-01-01
      相关资源
      最近更新 更多