我应该在交易中或之后运行VACUUM吗?

时间:2010-02-12 08:32:26

标签: sql mysql tsql sqlite postgresql

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

我想知道何时应该发出VACUUM

  • 在交易中,作为最终声明
  • 或交易后?

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

4 个答案:

答案 0 :(得分:14)

在使用PostgreSQL时,您是否想要无法在manual中所述的交易中运行 VACUUM:

  

无法在事务块内执行VACUUM。

答案 1 :(得分:5)

我会在交易之外说。当然在PostgreSQL中,VACUUM旨在删除“死”元组(即记录被更改或删除时的旧行。)

如果您在已修改记录的事务中运行VACUUM,则这些死行不会被标记为删除。

根据您正在执行的VACUUM类型,它可能还需要一个表锁,如果有其他事务正在运行,它将阻塞,因此您可能最终陷入死锁状态(事务1被阻塞等待表锁定以执行其VACUUM,事务2被阻塞,等待事务1已锁定的行被释放。)

我还建议在应用程序中执行此操作(可能作为计划任务),因为它可能需要一段时间才能完成,并且可能会对其他查询的速度产生负面影响。

对于SQL Server,没有VACUUM - 您正在寻找的是缩小。您可以在2005年打开自动收缩,它会在服务器决定时自动回收空间,或者发出DBCC语句来收缩数据库和日志文件,但这取决于您在每个数据库级别的备份例程和策略。

答案 2 :(得分:1)

真空很像碎片整理,如果你最近删除了很多东西,或者你插入了很多东西之后,这样做很好,但绝不应该在每次交易中都这样做。它比几乎任何其他数据库命令都慢,而且更像是一项维护任务。

我们有时会添加/删除大部分的db文件,因此真空是一个好主意,但我仍然不认为它是同一事务的一部分。

答案 3 :(得分:0)

交易的频率是多少?

它实际上是一种日常的过程,而不是查询过程的查询,但如果你使用它而没有满,那么它可以在事务中使用,因为它没有获得锁。

如果您要这样做,那么它应该在交易之外,因为它独立于交易数据的完整性。