postgresql中执行VACUUM和执行VACUUM full有什么区别

305 阅读2分钟

在PostgreSQL(包括Supabase)中,VACUUMVACUUM FULL的区别主要体现在空间回收方式、执行效率和对表的锁定影响上,具体如下:


1. VACUUM(普通清理)

  • 作用:清理表和索引中的死元组(已删除或更新的旧版本数据),将这些空间标记为可重用,但不会物理缩小表文件大小。
  • 空间释放:不会将空间返还给操作系统,只是让数据库内部可以重用这部分空间。
  • 执行效率:速度快,执行时只需共享锁,不会阻塞读写操作。
  • 自动执行:PostgreSQL有autovacuum守护进程,会自动执行普通VACUUM以保持数据库健康。
  • 适用场景:频繁更新、删除的表,保持空间可重用,避免膨胀。

2. VACUUM FULL(彻底清理)

  • 作用:物理重写整个表,将活跃数据复制到新文件,完全删除死元组,释放未使用空间。
  • 空间释放:会将释放的空间返还给操作系统,表文件大小会明显减小。
  • 执行效率:执行速度慢,需要对表加排它锁(AccessExclusiveLock) ,期间阻塞所有对该表的读写操作。
  • 适用场景:删除大量数据后,想彻底回收磁盘空间,或者表膨胀严重时使用。
  • 缺点:执行期间表不可访问,可能影响业务,需在低峰期执行。

3. 总结对比表

特性VACUUMVACUUM FULL
是否释放空间给操作系统
是否锁表否(共享锁)是(排它锁,阻塞所有操作)
执行速度
是否自动执行是(autovacuum)
适用场景常规维护,清理死元组大量删除后彻底回收空间,表膨胀严重时

4. 实际建议

  • 日常维护用普通VACUUM即可,结合ANALYZE更新统计信息:

    VACUUM ANALYZE your_table;
    
  • 删除大量数据后,且需要回收磁盘空间时,执行VACUUM FULL

    VACUUM FULL your_table;
    
  • 运行VACUUM FULL时,注意业务影响,最好在低峰期执行。


5. 参考

  • PostgreSQL官方文档 VACUUM
  • CSDN博客《Postgresql之Vacuum和Vacuum full的区别》
  • 博客园《PostgreSQL的表膨胀与Vacuum和Vacuum Full》

综上,VACUUM适合日常清理和维护,VACUUM FULL适合需要彻底回收空间的场景,但会锁表且执行较慢。