PostgreSQL Vacuum and Vacuum full are not two different processes
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
- Updates the visibility map to optimize future queries
- 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 EXCLUSIVE
lock, 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 FULL
adds a table-rewrite step by callingcluster_rel()
- Configuration Integration: Parameters like
autovacuum_vacuum_scale_factor
apply to both, and autovacuum workers handle standardVACUUM
by default - Unified Command Structure: The
FULL
option is a modifier rather than a standalone tool, as seen in the SQL syntax:
1 2 | 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.
Comments
Post a Comment