Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 需要在Oracle DB中将已完成的记录从一个表移动到另一个表_Sql_Oracle_Performance_Archiving - Fatal编程技术网

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;