Oracle 存档和清除选项
Oracle Archive and Purge Options
根据我们的情况,我正在尝试找出执行存档和清除的最佳选项。
我们大约有 5000 万条记录 说 Table A。我们想 将数据归档到目标 table 然后 清除源 table 中的那些数据。我们希望根据相互重叠的几个标准保留数据库。例如,除了保留 Indicator='True' 的所有记录外,我们还想保留过去 5 个月的数据。 Indicator='True' 可能会 return 超过 5 个月的记录。这意味着我必须使用 OR 条件才能捕获数据。根据条件,我们需要保留1000万条记录和archive/purge4000万条记录。我需要创建一个流程,每 6 个月 运行 执行此操作。
我的问题是,最有效的选择 是什么来完成归档和清除? PROC/bulk delete/insert 是我最好的选择吗?
Partition似乎是不可能的,因为有几个条件相互重叠。
使用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
.....
根据我们的情况,我正在尝试找出执行存档和清除的最佳选项。
我们大约有 5000 万条记录 说 Table A。我们想 将数据归档到目标 table 然后 清除源 table 中的那些数据。我们希望根据相互重叠的几个标准保留数据库。例如,除了保留 Indicator='True' 的所有记录外,我们还想保留过去 5 个月的数据。 Indicator='True' 可能会 return 超过 5 个月的记录。这意味着我必须使用 OR 条件才能捕获数据。根据条件,我们需要保留1000万条记录和archive/purge4000万条记录。我需要创建一个流程,每 6 个月 运行 执行此操作。
我的问题是,最有效的选择 是什么来完成归档和清除? PROC/bulk delete/insert 是我最好的选择吗?
Partition似乎是不可能的,因为有几个条件相互重叠。
使用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
.....