EMZETT.
Giriş yap

PostgreSQL VACUUM: autovacuum ve şişmiş tablolar

Kısaca: PostgreSQL satırları hemen silmez, işaretler; VACUUM temizler, yeniden kullanım için alan açar ve istatistikleri güncel tutar, genellikle autovacuum aracılığıyla otomatik olarak.

Biraz daha ayrıntılı: MVCC nedeniyle (paralel işlemler için bir satırın birkaç sürümü) UPDATE ve DELETE ölü demetler üretir. Çalışan hiçbir erişim onlara artık ihtiyaç duymayana kadar kalırlar. VACUUM onları yeniden kullanım açısından kaldırır.

Ayrıntılı

VACUUM ne yapar

  • Ölü satırların alanını yeniden kullanılabilir olarak işaretler.
  • Görünürlük haritasını günceller (yalnızca dizin taramalarını hızlandırır).
  • İşlem kimliği taşmasına (wraparound) karşı korur (eski satırları dondurur).
  • VACUUM FULL tabloyu yeniden yazar ve alanı işletim sistemine iade eder ama özel olarak kilitler; nadiren gerekir (alternatif: pg_repack).
  • ANALYZE sorgu planlayıcı için istatistik toplar.

Autovacuum

Yeterli değişiklik biriktiğinde (varsayılan: tablonun %20’si + 50 satır) bir arka plan süreci VACUUM/ANALYZE başlatır. Ayarlar: autovacuum_vacuum_scale_factor, autovacuum_naptime, tablo başına ALTER TABLE … SET (autovacuum_vacuum_scale_factor = 0.02). Asla kapatma. Büyük, yoğun değişen tablolar için daha agresif yapılandır.

Şişmeyi (bloat) tespit etmek

Belirtiler: tablo/dizin aynı veri miktarına rağmen büyür, sorgular yavaşlar. Kontrol: pg_stat_user_tables (n_dead_tup, last_autovacuum), pg_total_relation_size ile boyut, pgstattuple uzantısı. Nedenler: uzun işlemler veya unutulmuş açık bağlantılar (temizliği engeller), çok seyrek autovacuum, sık toplu güncellemeler. Çözüm: işlemleri kısa tut, autovacuum’u daha ince ayarla, elle VACUUM (VERBOSE, ANALYZE) table;.

Uygulama ve yönetilen hizmetler

Neon, Supabase, RDS’de autovacuum çoğunlukla otomatik çalışır; yine de örüntüleri gözle (oturumlar, sayaçlar, kuyruklar gibi çok güncellenen tablolar: daha iyisi ekle + eski satırları sil veya bölümler). Büyük miktarları gruplar hâlinde sil. VACUUM FULL’dan önce yedek al. pg_stat_progress_vacuum’u oku. idle in transaction içinde takılı kalan bağlantılar her vacuum’un düşmanıdır: idle_in_transaction_session_timeout ile sınırla.

Ayrıca bak: PostgreSQL, MVCC ve yalıtım düzeyleri, PostgreSQL dizinleri, Bağlantı havuzlama