删除Oracle数据库上的旧数据的技术

Ste*_*erg 6 oracle partitioning purge

我们有一个成熟的Oracle数据库应用程序(已经生产了10多年),在此期间,我们一直在使用我们自己设计的脚本来删除不再需要的旧数据.它们通过在频繁提交的循环中针对适当的表发出delete语句来工作,以避免使用i/o或使用过多的撤消空间来使系统过载.

在大多数情况下,它们工作正常.它们每天运行,从系统中删除最早的数据需要大约一个小时.我所关注的主要问题是对所有这些删除可能具有的表和索引的影响,以及尽管它们不会过度加载系统,但在短时间内删除一天的数据确实会产生影响out实例缓冲区缓存,导致后续查询在接下来的几个小时内运行稍慢,因为缓存逐渐恢复.

多年来我们一直在考虑更好的方法.在过去,我听说人们使用分区表来管理旧数据收获 - 例如,每个分区一个月,并且每月删除最旧的分区.这种方法的主要缺点是我们的收获规则超出了"删除月X".用户可以根据键值指定数据在系统中必须保留多长时间(例如,在发票表中,帐户foo可以在3个月后删除,但帐户栏可能需要保留2年).

还存在参照完整性问题; Oracle文档讨论了使用分区来主要在数据仓库的上下文中清除数据,其中表往往是超立方体.我们更接近OLTP的结尾,并且月X中的数据与月Y中的数据有关系是很常见的.为这些表创建正确的分区键最多也是痒痒的.

至于缓存井喷,我已经阅读了一些关于设置专用缓冲区缓存的内容,但它看起来更像是基于每个表,而不是基于每个用户或每个事务.为了保留缓存,我真的希望收获工作随时只在缓存中保留一个事务的数据,因为删除后不需要保留数据.

我们是否在可预见的未来坚持使用删除,还是有其他更聪明的方法来处理收割?

Dav*_*dge 4

在大多数情况下,我认为你被困在删除操作中。

您对在您的情况下使用分区的困难的评论可能确实阻止了它们的有效使用(根据记录类型使用不同的删除日期),但您可以在您想要的记录上创建一个“删除日期”列。可以分区吗?它的缺点是使更新变得相当昂贵,因为删除日期的更改可能会导致行迁移,因此您的更新实际上会被实现为删除和插入。

即使如此,由于引用完整性问题,您也可能无法使用 DDL 分区操作来删除旧数据,但分区仍然可以达到对要删除的行进行物理集群的目的,以便删除时需要修改的块更少它们,减轻对缓冲区高速缓存的影响。