Oracle 数据库 table 删除最佳实践

Oracle database table delete best practices

环境:Oracle 12C

得到一个 table 大约有 10 列,其中包括很少的 clob 和日期列。对于如下所述的 ETL 过程,这是一个非常繁忙的 table-

首先将平面文件加载到 table,然后进行更新和处理。插入和更新是分批进行的。插入和更新了数百万条记录。

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

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

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

您应该寻找的第一件事是解耦各种 ETL 过程,这样您就不需要同时或按特定顺序执行所有这些过程。从而去除INSERTS/UPDATESDELETES的依赖。虽然 insert/update 您可以在 ETL 中的单个 MERGE 块中进行管理,但您可以稍后通过简单地标记要稍后删除的行来进行删除,从而执行 软删除。您可以将此作为 table 列中的标志。并在您的应用程序和查询中使用相同的方法来过滤掉它们。

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

如果您将 table 分区为日期范围,那么您可以查看 DROP/TRUNCATE 分区,它将丢弃存储在该分区中的行作为 DDL 语句。这无法回滚。它执行速度快并且使用很少的系统资源(撤消和重做)。您可以在 documentation.

中阅读更多相关信息