我有一个Oracle表,其中包含应用程序的事件日志消息。我们不希望这个表失去控制并占用太多空间,所以我们想设置一个上限,它可以包含一些大数字,例如一百万。
所以我们想告诉Oracle,当表变得太大时,它应该删除最旧的行以为新行腾出空间。
有没有办法做到这一点?我想我们可以通过触发器或使用存储过程进行所有插入来完成此操作,但是有什么更简单的吗?
编辑:一些答案提出了涉及分区的解决方案。我们目前没有对此表进行分区,尽管我们有必要这样做。然而,从调查问题来看,似乎即使我们对表进行分区,我们仍然需要某种预定的作业来删除旧的分区等等。所以我们决定放弃分区而不是预定作业,以检查行数,并根据需要每天删除一行旧行。
感谢大家的帮助。
答案 0 :(得分:4)
取决于您对简单...的定义
我的偏见是安排定期(例如,每晚)运行的作业,以便删除最旧的行。如果您希望在一天内生成一百万个事件日志,您可能希望该作业更频繁地运行,但对于大多数人来说,夜间通常就足够了。这具有异步的优点,因此每次执行插入时都不会产生计数一百万行的开销,以确定是否必须清除某些数据。另一方面,它可能需要一些管理来设置工作。
答案 1 :(得分:2)
你有分区选项吗?
如果是这样,这是滚动分区窗口的一个很好的候选者。随着警报日志的老化,您可以删除最旧的分区。
答案 2 :(得分:1)
你无法告诉Oracle将我的桌子保持在一定的大小。如果这是新闻,分区可能不适合你。否则,我完全赞同尼克。
请记住1M只是一个你决定保留的神奇数字,如果它在清理发生之前达到1.1M就没问题。如果您执行滚动分区,则需要在几天内放弃1M号码才能保留。您可以每天,每周,每个分区制作,并根据您的标准删除最旧的分区。
在您的问题中添加评论,以表明您是否进行了分区。
答案 3 :(得分:1)
如果您只有几千行,请确保简单删除即可。但是,如果您期望增长或拥有大量数据,那么分区是您最好的方法。
我可能错过了一些功能等,分区将非常适合删除数据。它速度快,可以保持您的数据有条理。并且可以扩展到大数据量。