VACUUM, ANALYZE, AUTOVACUUM — nima uchun kerak

~20 daq · PostgreSQL · Index va Performance

Ko'p DELETE va UPDATE bajarilgan jadval vaqt o'tishi bilan sekinlasha boshlaydi. Diskda "o'lik qatorlar" to'planadi, statistika eskiradi. PostgreSQL ning VACUUM va ANALYZE jarayonlari bu muammolarni hal qiladi.


PostgreSQL MVCC va o'lik qatorlar

PostgreSQL DELETE da qatorni darhol o'chirmasdi — "o'lik" deb belgilaydi. UPDATE ham shu: eski versiya "o'lik", yangi versiya qo'shiladi. Bu MVCC (Multi-Version Concurrency Control) — boshqa tranzaksiyalar eski versiyani ko'rishda davom etishi uchun.

Vaqt o'tishi bilan o'lik qatorlar to'planadi:

  • Jadval hajmi oshadi
  • So'rovlar sekinlashadi
  • Index katta bo'lib qoladi

VACUUM o'lik qatorlarni tozalaydi.


VACUUM

VACUUM foydalanuvchilar;
-- O'lik qatorlarni belgilaydi — qayta ishlatish uchun
-- Jadval hajmini kamaytirmaydi (OS ga qaytarmaydi)
VACUUM FULL foydalanuvchilar;
-- Jadvalni qayta yozadi — hajmni kamaytiradi
-- LOCK — bajarilayotganda jadval bloklangan!
VACUUM VERBOSE foydalanuvchilar;
-- Tafsilotlar bilan

VACUUM ANALYZE foydalanuvchilar;
-- VACUUM + statistika yangilash

ANALYZE — statistika yangilash

PostgreSQL so'rov rejasini tuzishda statistikadan foydalanadi: qancha qator bor, qiymatlar qanday taqsimlangan. Statistika eskirsa — noto'g'ri reja, sekin so'rov.

ANALYZE foydalanuvchilar;
-- Bir jadval

ANALYZE;
-- Barcha jadvallar

Ko'p INSERT, UPDATE, DELETE dan keyin ANALYZE foydali.


AUTOVACUUM — avtomatik tozalash

PostgreSQL AUTOVACUUM jarayoni jadvallarni avtomatik tozalaydi. Sukut bo'yicha yoqilgan.

Qachon ishga tushadi:

autovacuum_vacuum_threshold    = 50      (qatorlar)
autovacuum_vacuum_scale_factor = 0.2     (20%)

O'lik qatorlar > 50 + jadval_hajmi * 0.2 bo'lsa — VACUUM

Ko'rish:

SELECT relname, last_vacuum, last_autovacuum,
       n_dead_tup, n_live_tup
FROM pg_stat_user_tables
WHERE relname = 'foydalanuvchilar';

Autovacuum sozlash

Katta va ko'p o'zgaradigan jadvallar uchun jadval darajasida sozlash:

ALTER TABLE buyurtmalar SET (
  autovacuum_vacuum_scale_factor = 0.05,  -- 5% (standart 20%)
  autovacuum_analyze_scale_factor = 0.02  -- 2% (standart 10%)
);

Ko'p o'zgaradigan jadvalda autovacuum tezroq ishlashi uchun chegara pasaytiriladi.


Tez-tez uchraydigan xatolar

VACUUM FULL ishlab turgan jadvalda:

VACUUM FULL exclusive lock oladi — barcha so'rovlar kutadi. Faqat texnik xizmat vaqtida (kechasi) ishlatilsin.

Autovacuum o'chirilgan:

-- ❌ — o'chirish
ALTER TABLE t SET (autovacuum_enabled = false);

Autovacuumni o'chirmaslik kerak — o'lik qatorlar to'planib, jadval sekinlashadi.


Xulosa

VACUUM jadval;           -- o'lik qatorlarni belgilash (tez, locksiz)
VACUUM FULL jadval;      -- qayta yozish, hajm kamaytirish (LOCK!)
ANALYZE jadval;          -- statistika yangilash
VACUUM ANALYZE jadval;   -- ikkalasi birga

-- Holat ko'rish
SELECT relname, n_dead_tup, last_autovacuum
FROM pg_stat_user_tables;

Autovacuum odatda yetarli. Ko'p DELETE/UPDATE bo'lgan jadvallarda autovacuum_vacuum_scale_factor ni pasaytiring.


Keyingi dars

42-dars: Connection Pool — PgBouncer, sozlash