Oracle 通过删除旧行自动强制最大数据库表大小

Oracle 通过删除旧行自动强制最大数据库表大小,oracle,Oracle,我有一个Oracle表,其中包含应用程序的事件日志消息。我们不希望这个表失去控制并占用太多空间,所以我们希望将它可以包含的行数设置为一个上限,比如一百万 因此,我们想告诉Oracle,当表变得太大时,它应该删除最旧的行,以便为新行留出空间 有没有办法做到这一点?我想我们可以用触发器或用存储过程进行所有插入来实现这一点,但还有更简单的方法吗 编辑:有几个答案建议了涉及分区的解决方案。我们目前不划分这个表,尽管我们有能力在必要时这样做。然而,从这个问题来看,似乎即使我们对表进行分区,我们仍然需要某种

我有一个Oracle表,其中包含应用程序的事件日志消息。我们不希望这个表失去控制并占用太多空间,所以我们希望将它可以包含的行数设置为一个上限,比如一百万

因此,我们想告诉Oracle,当表变得太大时,它应该删除最旧的行,以便为新行留出空间

有没有办法做到这一点?我想我们可以用触发器或用存储过程进行所有插入来实现这一点,但还有更简单的方法吗

编辑:有几个答案建议了涉及分区的解决方案。我们目前不划分这个表,尽管我们有能力在必要时这样做。然而,从这个问题来看,似乎即使我们对表进行分区,我们仍然需要某种计划作业来删除旧分区,等等。因此,我们决定放弃分区,转而使用计划作业来检查行数,并根据需要每天删除一次旧行


谢谢大家的帮助。

取决于您对“更简单”的定义


我的偏好是安排一个定期(比如说,每晚)运行的作业,以便删除最早的行。如果您希望在一天内生成一百万个事件日志,那么您可能希望作业运行得更频繁,但对于大多数人来说,每晚就足够了。这样做的好处是异步的,这样您就不会在每次执行插入时计算一百万行的开销,以确定是否必须清除某些数据。另一方面,设置作业可能需要一些管理。

您有分区选项吗


如果是这样,这是滚动分区窗口的一个很好的候选者。随着警报日志的老化,您可以删除最旧的分区。

您不能告诉Oracle将我的表保持在特定的大小。如果这是新闻,分区可能不适合您。否则,我完全同意尼克的看法

记住,1米只是一个你决定保留的神奇数字,如果它在清理之前达到1.1米就可以了。如果您使用滚动分区,则需要放弃1M号码几天才能保留。您将根据您的标准创建、每日、每周或任何分区,并删除最旧的分区


在您的问题中添加一条注释,说明您是否有分区。

如果您只有几千行,请确保简单的删除即可。但是,如果您希望增长或者已经有大量数据,那么分区是您最好的方法

  • “删除”可能容易撤消空间错误
  • 删除可能容易导致快照到旧错误
  • 删除不会减少表格HWM(高水位线)
  • 根据数据大小,删除可能需要一段时间
  • 删除会生成大量重做(取决于实际删除的数据量)
  • 删除分区只会产生很少的重做
  • 分区可以改进Oracle执行分区消除的某些查询
我可能错过了一些特性,分区对于删除数据非常有用。它的速度很快,会让你的数据井然有序。并且可以扩展到大数据量。

如果它是一个“大”表,那么您可能会发现分区的性能更高。你可以不费吹灰之力就把它们扔了。如果您必须在一个大表上进行选择并从中删除行,那么在撤消/重做方面会有开销。当然是你的决定。