gpt4 book ai didi

oracle - Oracle 数据库旧数据删除技术

转载 作者:行者123 更新时间:2023-12-04 15:28:24 25 4
gpt4 key购买 nike

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

在大多数情况下,它们运行良好。它们每天运行,从系统中删除最旧日期的数据大约需要一个小时。我主要担心的是所有这些删除可能对表和索引产生的影响,事实上,即使它们不会过度加载系统,在这么短的时间内删除一天的数据确实会产生影响出实例缓冲区缓存,导致后续查询在接下来的几个小时内随着缓存逐渐恢复而运行速度略慢。

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

还有参照完整性的问题; Oracle 文档主要在数据仓库的上下文中讨论使用分区来清除数据,其中表往往是超立方体。我们更接近于 OLTP 的结局,X 月的数据与 Y 月的数据有关系是很常见的。为这些表创建正确的分区键充其量是很棘手的。

至于缓存溢出,我已经阅读了一些关于设置专用缓冲区缓存的内容,但似乎更多的是基于每个表,而不是基于每个用户或每个事务。为了保留缓存,我真的希望收割作业在任何时候都只在缓存中保留一个事务的数据,因为一旦删除就不需要保留数据。

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

最佳答案

在大多数情况下,我认为您一直在执行删除操作。

您对在您的案例中使用分区的难度的评论可能确实阻止了它们的有效使用(根据记录类型使用不同的删除日期),但您可以在您的记录上创建一个“删除日期”列可以分区吗?这样做的缺点是更新成本很高,因为删除日期的更改可能会导致行迁移,因此您的更新实际上将作为删除和插入来实现。

可能即使那样,由于参照完整性问题,您也无法使用 DDL 分区操作来删除旧数据,但是分区仍然可以用于将要删除的行进行物理集群的目的,以便需要修改较少的块来删除它们,减轻对缓冲区缓存的影响。

关于oracle - Oracle 数据库旧数据删除技术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/981762/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com