首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现一个环形缓冲区

实现一个环形缓冲区
EN

Stack Overflow用户
提问于 2014-03-28 19:31:05
回答 5查看 3.6K关注 0票数 9

我们有一个记录数据的表。它以每秒15K行的速度记录数据。

问:我们如何将表大小限制在最新的10亿行?

即,一旦达到10亿行,它就变成环形缓冲区,在添加最新行时删除最旧的行。

触发器可能会给系统带来过多的负载。在SO上Here's一个触发器示例。我们已经使用了一系列的调整来保持速度(比如存储过程,表参数等)。

EN

回答 5

Stack Overflow用户

发布于 2014-03-28 19:40:07

除非10亿有什么神奇之处,否则我认为你应该考虑其他方法。

首先想到的是对数据进行分区。比方说,在每个分区中放入一个小时的数据。这将在一个分区中产生大约15,000*60*60 =5400万条记录。大约每隔20个小时,您就可以删除一个分区。

分区的一大优点是插入性能应该很好,并且您不必删除单个记录。根据查询负载、索引和其他因素,可能会有额外的开销。但是,由于没有额外的索引和主要是插入的查询负载,它应该能更好地解决您的问题,而不是每秒尝试删除15,000条记录和插入。

票数 3
EN

Stack Overflow用户

发布于 2014-03-28 19:52:39

我没有一个完整的答案,但希望能有一些想法来帮助你开始。

我会向表中添加某种数值列。该值将递增1,直到达到您想要保留的行数。此时,该过程将切换到update语句,覆盖前一行,而不是插入新行。显然,您不能使用该列来确定行的顺序,因此,如果您还不能确定行的顺序,我还将添加一个时间戳列,以便您以后可以按时间顺序对它们进行排序。

为了协调事务之间的计数器值,您可以使用一个序列,然后执行模除法以获得计数器值。

为了处理表中的任何间隙(例如,有人删除了一些行),您可能希望使用merge语句。如果该行丢失,则应执行insert;如果该行存在,则应执行update。

希望这能有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2014-03-28 19:44:13

这是我的建议:

  • 使用1,000,000,000行预先填充表,其中包括行号作为主键。
  • 不是insert新行,而是让记录器保留一个每次递增的计数器变量,并根据行号update适当的行。

这实际上是您在其他上下文中使用环形缓冲区所要做的事情。您不会一直分配内存和删除内存;您只需要一遍又一遍地重写相同的数组。

更新:更新doesn't actually change the data in place,正如我所想的那样。所以这可能不是很有效。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22711652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档