【问题标题】:Need to move COMPLETED records from one table to other Table in Oracle DB需要将完成的记录从一个表移动到 Oracle DB 中的另一个表
【发布时间】:2019-10-24 06:08:33
【问题描述】:

我在表中有数百万条记录并且每秒累积,所以每当记录标记为 COMPLETE 时,我想将该记录移动到备份表中。 我将定期运行这项工作。另外我不想通过这个移动操作中断数据库中的其他操作。

我已尝试以下查询。


insert into Table_Bakup  
select * from Table where batch_status ='COMPLETED' 
and ID not in (select ID from Table_Bakup )

delete from Table 
where ID in  (select ID from Table_Bakup )

但是上面的查询性能会受到影响。谁能建议我如何实现这一目标?

【问题讨论】:

  • 我知道您可以创建一个AFTER UPDATE 触发器来执行此操作。一旦行更新,将数据插入备份表,然后从主表中删除。
  • 您希望从这个练习中获得什么好处?您的基表存在哪些性能问题?

标签: sql oracle performance archiving


【解决方案1】:

您提到的“定期”听起来像是计划运行的数据库作业......我不知道多久。一天一次?每2小时?由你决定。

过程可能如下所示:

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_to_be_moved?由于有数百万行受到影响,在您的 insertdelete 语句之间可能有一些其他行被设置为“完成”(以及那些已提交的事务)。如果您使用 ID,是的 - 这可行,但是 - 您必须将 table 中的数百万行与 table_bakup 中的数十亿行进行比较,因此这种 (cb_to_be_moved) 方法可能会更快。

数据库触发器?是的,但是 - 想象一下当它触发数百万行时会发生什么……数据库可能阻塞。或者可能不是;尝试测试一下。

【讨论】:

  • 所以您建议再添加一列“cb_to_be_moved”?
  • 是的;忘记说清楚了,抱歉。
猜你喜欢
  • 1970-01-01
  • 2019-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多