Sql 需要在Oracle DB中将已完成的记录从一个表移动到另一个表
我在表中有一百万条记录,并且每秒都在累积,所以每当记录标记为完成状态时,我都希望将该记录移动到备份表中。 这项工作我将定期运行。另外,我不想通过这个移动操作中断数据库中的其他操作 我尝试了下面的查询Sql 需要在Oracle DB中将已完成的记录从一个表移动到另一个表,sql,oracle,performance,archiving,Sql,Oracle,Performance,Archiving,我在表中有一百万条记录,并且每秒都在累积,所以每当记录标记为完成状态时,我都希望将该记录移动到备份表中。 这项工作我将定期运行。另外,我不想通过这个移动操作中断数据库中的其他操作 我尝试了下面的查询 但是使用上述查询,性能将受到影响。有人能建议我如何做到这一点吗?你提到的“定期”听起来像是一个计划运行的数据库作业。。。我不知道多久一次。一天一次?每两小时?由你决定 过程可能如下所示: update table set cb_to_be_moved = 1 where status = 'CO
但是使用上述查询,性能将受到影响。有人能建议我如何做到这一点吗?你提到的“定期”听起来像是一个计划运行的数据库作业。。。我不知道多久一次。一天一次?每两小时?由你决定 过程可能如下所示:
update table set cb_to_be_moved = 1 where status = 'COMPLETED';
insert into table_bakup (col1, col2, ...)
select col1, col2, ...
from table
where cb_to_be_moved = 1;
delete from table where cb_to_be_moved = 1;
为什么要移动cb?由于有数百万行受到影响,在insert
和delete
语句之间,可能还有一些其他行被设置为“已完成”(以及那些已提交的事务)。如果您使用ID,是的-这是可行的,但是-您必须将表中的数百万行与表中的数十亿行进行比较
,因此这种(cb\u-to\u-be\u-move
)方法可能更快
数据库触发器?是的,但是-想象一下当它发射数百万行时会发生什么。。。数据库可能会阻塞。或许不是;尝试测试它。我知道您可以在更新后创建一个触发器来执行此操作。行一更新,就将数据插入备份表,然后从主表中删除。您希望从这个练习中获得什么好处?您的基表存在哪些性能问题?因此,您建议再添加一列“cb_to_be_moved”?是的;忘了明确地说出来,对不起。
update table set cb_to_be_moved = 1 where status = 'COMPLETED';
insert into table_bakup (col1, col2, ...)
select col1, col2, ...
from table
where cb_to_be_moved = 1;
delete from table where cb_to_be_moved = 1;