PostgreSQL Vacuum and Vacuum full are not two different processes
PostgreSQL Vacuum: PostgreSQL‘s VACUUM and VACUUM FULL are not separate processes but rather different operational modes of the same maintenance command. Here’s why:
Core Implementation
Both commands share the same underlying codebase and are executed through the vacuum_rel() function in PostgreSQL‘s source code (src/backend/commands/vacuum.c). The key distinction lies in the FULL option, which triggers additional steps:
- Standard
VACUUM:- Removes dead tuples (obsolete rows) and marks space reusable within PostgreSQL
- Additionally, it updates the visibility map to optimize future queries
- Moreover, it Runs concurrently with read/write operations
VACUUM FULL:- Rewrites the entire table into a new disk file, compressing it and reclaiming space for the operating system
- Rebuilds all indexes and requires an
ACCESS EXCLUSIVElock, blocking other operations
Key Differences in Behavior
| Aspect | Standard VACUUM | VACUUM FULL |
|---|---|---|
| Space Reclamation | Internal reuse only | OS-level space release |
| Locking | Non-blocking | Full table lock |
| Performance Impact | Lightweight, incremental | Heavy, resource-intensive |
| Use Case | Routine maintenance | Severe table bloat remediation |
Why They Aren’t Separate Processes
- Shared Code Path: Both use the same core logic for dead-tuple identification and cleanup.
VACUUM FULLadds a table-rewrite step by callingcluster_rel() - Configuration Integration: Parameters like
autovacuum_vacuum_scale_factorapply to both, and autovacuum workers handle standardVACUUMby default - Unified Command Structure: The
FULLoption is a modifier rather than a standalone tool, as seen in the SQL syntax:
VACUUM (FULL, ANALYZE) table_name; -- vs. VACUUM table_name;
When to Use Each
- Standard
VACUUM: Daily maintenance to prevent bloat from MVCC dead tuples VACUUM FULL: Rarely, for extreme cases where table size has grown uncontrollably due to long-unvacuumed updates/deletes
In summary, while their outcomes differ significantly, VACUUM and VACUUM FULL are part of a single maintenance framework, differentiated primarily by the aggressiveness of space reclamation and locking behavior.
PostgreSQL Vacuum Internals – What happens during PostgreSQL Vacuum Processing?