VACUUM, ANALYZE, AUTOVACUUM — nima uchun kerak
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