1

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

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

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

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

4

1 回答 1

2

使用复合分区,例如范围(用于您的时间维度)和列表(以区分应该保持长时间和有限时间的行。

例子

带有的行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 

现在使用分区扩展名来引用应该删除的子分区。

删除超过 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   
.....
于 2020-02-11T20:08:43.790 回答