【发布时间】:2010-11-11 06:21:46
【问题描述】:
我正在使用一个可能会变得非常大的 sqlite3 数据库。存储空间是一个问题,所以我考虑将 auto_vacuum pragma 设置为 on,以便实际释放被删除行占用的空间,而不是仅仅标记为可重复使用。
在我的场景中,数据库可能每月增长数百 MB,而超过 6 个月的行会以细粒度的方式衰减。这是通过一个作业队列来实现的,该队列随机执行除当前任务之外的删除 nn 个最旧记录的任务,其中 nn 取决于队列中有多少高优先级任务。
我希望这样可以避免编写导致长期 RW 饥饿的维护作业(以分钟为单位,删除行,然后运行 VACUUM),而同一时间可以实现几个 MS。这可能意味着“旧”行在数据库中的保留时间比其他情况多几天,但这是可以接受的折衷。
我的问题是,根据您的经验(也许是意见),根据我的描述,打开 auto_vacuum 会是一个不可接受的妥协吗?如果是这样,出于什么原因?我没有广泛使用 sqlite3,更不用说它为调整而提供的各种 pragma,所以我希望在做出判断之前征求我缺乏的经验,我可能会在几个月后后悔:)
我使用的是 C 接口,如果有什么不同的话。
【问题讨论】:
-
一个数据点:Firefox 使用 sqlite 并且(显然)不使用 auto_vacuum,所以也许他们认为这是不可取的。但是,有一个插件可以强制进行真空,许多人发现它可以提高性能,因此最终不进行真空也是有代价的。
-
@Ben - 我正在阅读相关内容。希望有人可以阐明将 pragma 设置为高的可能后果。