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

Pen*_*m10 8 mysql sql t-sql sqlite postgresql

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

我想知道什么时候才能发行VACUUM

  • 在交易中,作为最终声明
  • 还是在交易之后?

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

Mil*_*dev 14

在使用PostgreSQL时是否需要,您无法在交易中运行 VACUUM,如手册中所述:

无法在事务块内执行VACUUM.


And*_*lam 5

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

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

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

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

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