0

环境:Oracle 12C

得到一个包含大约 10 列的表,其中包括很少的 clob 和 date 列。这是一个非常繁忙的 ETL 过程表,如下所述 -

平面文件首先加载到表中,然后更新和处理。插入和更新分批进行。数以百万计的记录被插入和更新。

还有一个删除过程,可以根据表中的日期字段删除旧数据。删除过程作为 pl/sql 过程运行,并在循环中从表中删除,仅基于日期字段获取前 n 条记录。

我不希望删除过程干扰常规的插入/更新。对删除进行编码以使其对常规插入/更新过程的影响最小的最佳做法是什么?

我还可以对表进行分区并并行删除,因为每个分区都使用自己的回滚段,但我正在寻找一种更简单的方法来调整删除过程。关于使用特殊回滚段或其他调整技巧的任何建议?

4

1 回答 1

3

您应该寻找的第一件事是将各种 ETL 流程解耦,这样您就不需要一起或按特定顺序执行所有这些流程。因此,消除了INSERTS/UPDATESDELETES. 虽然您可以在 ETL 中的单个MERGE块中管理插入/更新,但您可以稍后通过简单地标记要稍后删除的行来执行删除,从而执行软删除。您可以将其作为表格列中的标志来执行。并在您的应用程序和查询中使用相同的内容将它们过滤掉。

通过稍后进行删除,ETL的关键路径应该最小化。根据日期范围对数据进行分区绝对可以帮助您维护数据,并且如果它是日期驱动的,还可以使交易高效。此外,逐行查找任何逐行缓慢的事务,并将它们批量制作。尽量避免SQL 和 PL/SQL 之间的上下文切换。

如果您将表分区为日期范围,那么您可以查看DROP/TRUNCATE分区,它将丢弃存储在该分区中的行作为DDL语句。这不能回滚。它执行速度快并且使用很少的系统资源(撤消和重做)。您可以在文档中阅读有关它的更多信息。

于 2020-04-15T22:08:22.980 回答