sqlite3 auto_vacuum pragma有缺点吗?

时间:2010-11-11 06:21:46

标签: c sqlite

我正在使用一个可能会变得非常大的sqlite3数据库。存储空间是一个问题,因此我正在考虑将auto_vacuum pragma设置为on,以便实际释放已删除行占用的空间,而不是仅标记为可重用。

在我的场景中,数据库每月可以增长几百MB,而大于6个月的行会以细微的方式衰减。这是通过一个作业队列来实现的,该队列除了当前任务之外还随机删除了除去nn最旧记录的任务,其中nn由队列中有多少高优先级任务决定。

我希望这可以避免必须编写导致长时间RW饥饿的维护作业(以分钟为单位,删除行然后运行VACUUM),同时可以同时实现几个MS。这可能意味着“旧”行在数据库中保留的时间比其他情况要长几天,但这是可以接受的权衡。

我的问题是,根据你的经验(也许是意见),根据我的描述,打开auto_vacuum是不可接受的妥协?如果是这样,原因是什么?我没有广泛使用sqlite3,更不用说它为调整提供的各种pragma了,所以我希望在做出判断之前征求我缺乏的经验,我可能会在几个月后后悔:)

我正在使用C接口,如果它有任何区别。

1 个答案:

答案 0 :(得分:2)

liferea开发者explains why

  

问题在于它还需要很长时间。使用50MB的DB文件,我的运行时间超过1分钟。这就是为什么这对于有经验的用户而言只是一种工具,他们知道如何手动知道会发生什么。为了在运行时自动执行这样的长期操作,对于毫无戒心的用户来说肯定是不可接受的。此外,如何确定何时执行VACUUM以节省磁盘空间并提高性能也没有好办法。