在PostgreSQL(包括Supabase)中,VACUUM和VACUUM FULL的区别主要体现在空间回收方式、执行效率和对表的锁定影响上,具体如下:
1. VACUUM(普通清理)
- 作用:清理表和索引中的死元组(已删除或更新的旧版本数据),将这些空间标记为可重用,但不会物理缩小表文件大小。
- 空间释放:不会将空间返还给操作系统,只是让数据库内部可以重用这部分空间。
- 执行效率:速度快,执行时只需共享锁,不会阻塞读写操作。
- 自动执行:PostgreSQL有
autovacuum守护进程,会自动执行普通VACUUM以保持数据库健康。 - 适用场景:频繁更新、删除的表,保持空间可重用,避免膨胀。
2. VACUUM FULL(彻底清理)
- 作用:物理重写整个表,将活跃数据复制到新文件,完全删除死元组,释放未使用空间。
- 空间释放:会将释放的空间返还给操作系统,表文件大小会明显减小。
- 执行效率:执行速度慢,需要对表加排它锁(AccessExclusiveLock) ,期间阻塞所有对该表的读写操作。
- 适用场景:删除大量数据后,想彻底回收磁盘空间,或者表膨胀严重时使用。
- 缺点:执行期间表不可访问,可能影响业务,需在低峰期执行。
3. 总结对比表
| 特性 | VACUUM | VACUUM 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适合需要彻底回收空间的场景,但会锁表且执行较慢。