我应该在事务中还是之后运行VACUUM?

11

我有一个移动应用程序的同步过程,该交易在数据库上进行大量修改。由于这是在移动设备上完成的,因此我需要发出VACUUM命令来压缩数据库。

我想知道何时应该发出VACUUM命令:

  • 在事务中,作为最后一个语句
  • 或在事务之后?

我目前正在查找SQLite,但如果其他引擎不同,请在答案中告诉我(PostgreSQL、MySQL、Oracle、SQLServer)。

4个回答

16

当使用PostgreSQL时,无论你是否想要,在事务中是无法运行 VACUUM的,正如手册所述:

不能在事务块内执行VACUUM。


7
我认为这与事务无关。在 PostgreSQL 中,VACUUM 旨在删除“死元组”(即当记录已更改或删除时的旧行)。如果在修改记录的事务中运行 VACUUM,则这些死行不会被标记为删除。
根据您执行的 VACUUM 类型,它可能还需要表锁,如果有其他正在运行的事务,则会被阻止,因此您可能最终会陷入死锁状态(事务 1 被阻塞等待表锁来执行其 VACUUM,事务 2 被阻塞等待释放一个行,而该行被事务 1 锁定)。
我还建议不要在应用程序中执行此操作(例如作为计划任务),因为它可能需要一段时间才能完成,并可能会对其他查询的速度产生负面影响。
至于 SQL Server,没有 VACUUM - 您要找的是收缩。 您可以在 2005 年启用自动收缩,这将在服务器决定时自动回收空间,或者发出 DBCC 语句来收缩数据库和日志文件,但这取决于每个数据库级别上的备份例程和策略。

1

清空操作类似于碎片整理,如果您最近删除了很多内容,或者在插入了大量内容后,进行一次清空是很好的选择,但绝不能在每个事务中都这么做。它比几乎任何其他数据库命令都要慢,更像是一项维护任务。

我们有时会添加/删除大部分数据库文件,因此进行清空是一个不错的主意,但我仍然不认为它是执行该操作的同一事务的一部分。


0

这个交易是多频繁运行的?

这实际上是一个每日处理的过程,而不是一个逐个查询的过程,但如果您在没有完全使用它的情况下使用它,则可以在事务中使用它,因为它不会获取锁。

如果您要执行此操作,则应该将其放在事务之外,因为它与事务数据的完整性无关。


移动同步过程完成后就可以了。事务之前对数据库进行了很多修改。由于这是在移动设备上完成的,因此我需要发出 VACUUM 命令来压缩数据库。 - Pentium10

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接