2008-10-14 50 views
2

我有一个Oracle表,它包含应用程序的事件日志消息。我们不希望这张桌子失去控制并占用太多空间,所以我们想要限制它可以包含的一些行数,例如一百万。通过删除旧行来自动实施最大数据库表大小

所以我们想告诉Oracle,当表格变得太大时,它应该删除最老的行以为新行腾出空间。

有没有办法做到这一点?我想我们可以通过触发器或通过使用存储过程来创建所有插入,但有没有更简单的方法?

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

感谢您的帮助,每个人。

+0

如果它是一个“大”表,那么你可能会发现分区更高性能。你可以放下他们没有大惊小怪。如果您必须在大表上进行选择并从中删除行,则会在撤销/重做方面产生开销。当然你的决定。 – 2008-10-16 01:27:19

回答

4

根据您的简单的定义...

我的偏见会安排定期运行(比如,夜间),以删除最早的行的工作。如果您希望在一天内能够生成一百万条事件日志,那么您可能希望该工作更频繁地运行,但对于大多数人来说,夜间通常已足够。这具有异步的优势,因此每次执行插入操作时都不会产生计算一百万行的开销,以确定是否必须清除某些数据。另一方面,它确实可能需要一些管理部门来完成这项工作。

2

你有分区选项吗?

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

+0

用drop代替删除。 – 2008-10-14 14:35:38

1

你不能告诉Oracle让我的表保持一定的大小。如果这是新闻,分区可能不适合你。否则,我完全同意尼克。

请记住,1M只是一个你决定保留的魔法数字,没关系,如果它在清理之前达到1.1M就没问题。如果您要滚动分区,则需要放弃您的1M号码以保留好几天。你会每天,每周,不管分区,根据你的标准放弃最老的。

添加评论到您的问题,以表明如果你有分区。

1

如果您只有几千行,确保简单的删除将起作用。但是,如果您预计增长或有大量数据,那么分区是您最好的方法。

  • 删除可能容易撤销空间错误。
  • 删除可能容易出现旧错误的快照。
  • 删除不会减少表格HWM(高水位标记)
  • 删除可能需要一段时间,具体取决于数据大小。
  • 删除会生成很多重做(取决于您实际删除多少数据)。
  • 删除分区会产生很少的重做。
  • 分区可以改进Oracle执行分区清除的某些查询。

我可能错过了一些功能等,分区将很好的下降数据。它的速度很快,将保持你的数据的组织。并且可扩展到大数据量。

相关问题