【发布时间】:2010-11-02 04:16:34
【问题描述】:
我们有一个成熟的 Oracle 数据库应用程序(已投入生产超过 10 年),在此期间,我们一直在使用我们自己设计的脚本来删除不再需要的旧数据。它们通过在频繁提交的循环中针对适当的表发出删除语句来工作,以避免系统因 i/o 过载或使用过多的撤消空间。
在大多数情况下,它们工作正常。它们每天运行,大约需要一个小时才能从系统中删除最旧日期的数据。我主要担心的是所有这些删除可能对表和索引产生的影响,以及即使它们不会过度加载系统,在短时间内删除一天的数据确实会产生影响由于缓存逐渐恢复,导致后续查询在接下来的几个小时内运行速度稍慢。
多年来,我们一直在考虑更好的方法。过去,我听说人们使用分区表来管理旧数据的回收——例如,每个分区一个月,然后每月删除最旧的分区。这种方法的主要缺点是我们的收获规则超出了“删除 X 月”的范围。允许用户根据键值指定数据必须在系统中保留多长时间(例如,在发票表中,帐户 foo 可以在 3 个月后删除,但帐户栏可能需要保留 2 年)。
还有参照完整性的问题; Oracle 文档主要在数据仓库的上下文中讨论使用分区来清除数据,其中表往往是超立方体。我们的更接近于 OLTP,X 月的数据与 Y 月的数据有关联是很常见的。为这些表创建正确的分区键充其量是很麻烦的。
关于缓存井喷,我已经阅读了一些关于设置专用缓冲区缓存的内容,但似乎更多的是基于每个表,而不是基于每个用户或每个事务。为了保留缓存,我真的很希望收割作业在任何时候只将一个事务的数据保留在缓存中,因为一旦删除就不需要保留数据。
在可预见的未来,我们是否会坚持使用删除,还是有其他更聪明的方法来处理收获?
【问题讨论】:
-
+1 好问题,希望我有一个聪明的解决方案,因为我可以自己使用它;-)
-
保留数据不是一种选择吗?即您可以过滤查询中的旧记录(例如,使用 VPD 谓词)而不返回旧记录。只是说如果删除行会导致性能问题,我至少会考虑保留它们不一定是更糟糕的情况的可能性。
标签: oracle partitioning purge