Database administrators often debate whether to automate PostgreSQL index rebuilding. While some assume fragmentation harms performance, others argue it’s rarely needed. This article clarifies when index reconstruction is justified and how to measure its impact.
B-Tree Index Degradation: What You Need to Know
PostgreSQL’s B-tree indexes degrade gradually due to DELETE/UPDATE operations. Unlike tables, indexes don’t automatically reclaim space:
- Fragmentation occurs when pages split unevenly.
- Fillfactor (default 90%) reserves space for updates, causing intentional 10% bloat.
While minor bloat is harmless, excessive fragmentation slows range scans (e.g., ORDER BY or multi-row queries). Key metrics to monitor:
- **
avg_leaf_density**: Lower values (<70%) indicate bloated pages. - **
leaf_fragmentation**: High values (>20%) mean fragmented leaf pages.
-- Example: Check index health with pgstattuple
SELECT
tree_level,
avg_leaf_density,
leaf_fragmentation
FROM pgstatindex('large_idx');
When Rebuilding Makes Sense
Rebuilding is rarely urgent. Prioritize these scenarios:
- Persistent bloat: If
avg_leaf_densitydrops below 60% consistently. - Performance regression: Observable slowdowns in range scans.
- Maintenance windows: Use
CONCURRENTLYto minimize downtime.
Avoid rebuilding prematurely—frequent rebuilds waste resources and disrupt caching.
Other Index Types
- GIN/GiST/SP-GiST: Rarely need rebuilding; use
REINDEXonly for corruption. - Hash Indexes: Obsolete in modern PostgreSQL; avoid in favor of BRIN or B-tree.
Final Recommendation
Leverage PostgreSQL’s adaptive storage:
- Rely on autovacuum for routine maintenance.
- Use
pgstattupleweekly to track metrics. - Rebuild only when empirical evidence (not assumptions) warrants it.
By prioritizing data-driven decisions, you’ll maintain peak performance without unnecessary overhead.

%20(2048%20x%201000%20%E5%83%8F%E7%B4%A0)%20(3).png)

%20(2048%20x%201000%20%E5%83%8F%E7%B4%A0)%20(2).png)
