【问题标题】:Are there drawbacks to the sqlite3 auto_vacuum pragma?sqlite3 auto_vacuum pragma 有缺点吗?
【发布时间】: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 设置为高的可能后果。

标签: c sqlite


【解决方案1】:

liferea 开发者explains why:

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

【讨论】:

  • 写的是确定自动运行 VACUUM。他不是在谈论 pragma auto_vacuum。两者都不一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-26
  • 2011-02-28
  • 1970-01-01
  • 1970-01-01
  • 2011-02-09
  • 1970-01-01
  • 2011-11-05
相关资源
最近更新 更多