我们有一个记录数据的表。它以每秒15K行的速度记录数据。
问:我们如何将表大小限制在最新的10亿行?
即,一旦达到10亿行,它就变成环形缓冲区,在添加最新行时删除最旧的行。
触发器可能会给系统带来过多的负载。在SO上Here's一个触发器示例。我们已经使用了一系列的调整来保持速度(比如存储过程,表参数等)。
发布于 2014-03-28 19:40:07
除非10亿有什么神奇之处,否则我认为你应该考虑其他方法。
首先想到的是对数据进行分区。比方说,在每个分区中放入一个小时的数据。这将在一个分区中产生大约15,000*60*60 =5400万条记录。大约每隔20个小时,您就可以删除一个分区。
分区的一大优点是插入性能应该很好,并且您不必删除单个记录。根据查询负载、索引和其他因素,可能会有额外的开销。但是,由于没有额外的索引和主要是插入的查询负载,它应该能更好地解决您的问题,而不是每秒尝试删除15,000条记录和插入。
发布于 2014-03-28 19:52:39
我没有一个完整的答案,但希望能有一些想法来帮助你开始。
我会向表中添加某种数值列。该值将递增1,直到达到您想要保留的行数。此时,该过程将切换到update语句,覆盖前一行,而不是插入新行。显然,您不能使用该列来确定行的顺序,因此,如果您还不能确定行的顺序,我还将添加一个时间戳列,以便您以后可以按时间顺序对它们进行排序。
为了协调事务之间的计数器值,您可以使用一个序列,然后执行模除法以获得计数器值。
为了处理表中的任何间隙(例如,有人删除了一些行),您可能希望使用merge语句。如果该行丢失,则应执行insert;如果该行存在,则应执行update。
希望这能有所帮助。
发布于 2014-03-28 19:44:13
这是我的建议:
insert新行,而是让记录器保留一个每次递增的计数器变量,并根据行号update适当的行。这实际上是您在其他上下文中使用环形缓冲区所要做的事情。您不会一直分配内存和删除内存;您只需要一遍又一遍地重写相同的数组。
更新:更新doesn't actually change the data in place,正如我所想的那样。所以这可能不是很有效。
https://stackoverflow.com/questions/22711652
复制相似问题