将包含大量数据的表归档到另一个表并在现有表中删除这些记录的最佳方法是什么?
目前,我这样做了:
/*insert into archive table */
insert into table_a_archive (select *
from table_a
where last_updated < sysdate - interval '1' year);
/* delete archived data from existing table */
delete from variable_value where last_updated < sysdate - interval '1' month;
有更好的方法吗?
答案 0 :(得分:0)
1)创建2个与table_a具有相同结构的新表:table_a_archive和table_a_new。 (不要忘记授予相同的权限,创建索引等原始table_a)
2)将table_a重命名为table_a_old
3)将table_a_new重命名为table_a
4)锁定表table_a_old(以防止迁移期间的任何更改)
5)使用条件多表插入将table_a_old中的所有数据移动到table_a_archive(当last_updated&lt; sysdate - interval'1'年时),并使用append hint和parallel
移动到table_a(else子句)6)提交
7)drop and purge table_a_old
此方法需要额外的可用空间并停止应用程序(当重命名表包可能无效时,迁移期间的新表将为空)。如果需要在线解决方案,可以使用dbms_redefinition捕获迁移期间发生的更改。
我还建议考虑在last_updated上使用RANGE分区的娱乐表,而不是有2个表。