Prügikoristus (VACUUM) eemaldab PostgreSQLis surnud reaversioonidest tekkinud tarbetu ruumikasutuse ja valmistab ruumi uute andmete jaoks. Statistika värskendamine (ANALYZE) kogub tabelite andmete kohta statistikat, mida päringuoptimeerija kasutab sobiva täitmisplaani valimiseks. Neid saab soovi korral käivitada käsitsi vastavalt VACUUM ja ANALYZE lausega.
PostgreSQLis korraldab automaatset prügikoristust (VACUUM) ja automaatset statistika värskendamist (ANALYZE) autovacuum-mehhanism, mis koosneb autovacuum launcher'ist ja selle käivitatavatest worker-protsessidest.
CREATE TABLE test_kasutaja (kasutaja_id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,nimi VARCHAR(100) NOT NULL,skoor DECIMAL(5,2) NOT NULL,registreerimis_aeg TIMESTAMPTZ(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0));INSERT INTO test_kasutaja (nimi, skoor, registreerimis_aeg)SELECT 'Kasutaja ' || i, /*Loob nimed: Kasutaja 1, Kasutaja 2 jne.*/round((random() * 100)::numeric, 2), /*Juhuslik skoor 0.00 ja 100.00 vahel*/CURRENT_TIMESTAMP(0) - (random() * interval '365 days') /*Juhuslik aeg viimase 1 aasta jooksul*/FROM generate_series(1, 10000) AS i;SELECT pg_size_pretty(pg_relation_size('test_kasutaja')) AS tabeli_suurus;/*Tabeli suurus: 664 kB*/
DELETE FROM Test_kasutaja;SELECT pg_size_pretty(pg_relation_size('test_kasutaja')) AS tabeli_suurus;/*Tabeli suurus endiselt: 664 kB*/
VACUUM test_kasutaja;SELECT pg_size_pretty(pg_relation_size('test_kasutaja')) AS tabeli_suurus;/*Tabeli suurus: 0 bytes*/PostgreSQLis korraldab automaatset prügikoristust (VACUUM) ja automaatset statistika värskendamist (ANALYZE) autovacuum-mehhanism, mis koosneb autovacuum launcher'ist ja selle käivitatavatest worker-protsessidest.
Need protsessid ei käivitu rangelt fikseeritud ajakava alusel (näiteks "iga viie minuti järel"), vaid reageerivad tabelites toimunud muudatustele. Autovacuum launcher (käivitaja) käivitab perioodiliselt worker'eid (töölisi), mis kontrollivad andmebaaside tabeleid ja otsustavad, kas mõni tabel vajab VACUUM-i (prügikoristus) või ANALYZE-i (statistika värskendamine).
1. Millise sagedusega need käivituvad?
A. Kontrollimise sagedus (autovacuum_naptime)
autovacuum_naptime = 1min
See tähendab, et autovacuum launcher korraldab andmebaaside kontrollimist ligikaudu selle intervalli alusel. Kui PostgreSQLi kobaras on mitu andmebaasi, jaotatakse worker'ite käivitamine nende vahel ajas.
B. Automaatne prügikoristus (VACUUM)
Automaatne VACUUM käivitub tabelil siis, kui surnud reaversioonide arv ületab vastava lävendi.
PostgreSQL 18-s arvutatakse lävend põhimõtteliselt järgmiselt:
MIN(
autovacuum_vacuum_max_threshold,
autovacuum_vacuum_threshold
+ autovacuum_vacuum_scale_factor
* tabeli hinnanguline ridade arv
)
Vaikeseaded on:
- autovacuum_vacuum_threshold = 50
- autovacuum_vacuum_scale_factor = 0,2
- autovacuum_vacuum_max_threshold = 100 000 000
Surnud reaversioonid tekivad eeskätt UPDATE- ja DELETE-operatsioonide tulemusena.
Näiteks 100 000 reaga tabeli puhul:
50 + (0,2 * 100 000) = 20 050
Seega käivitub automaatne VACUUM, kui surnud reaversioonide arv ületab ligikaudu 20 050. Arvutuses kasutatakse tabeli ridade arvu hinnangut, mitte tingimata täpset hetke ridade arvu.
PostgreSQL reageerib ka tabelitesse ainult uute ridade lisamisele. Selleks kasutatakse parameetreid:
- autovacuum_vacuum_insert_threshold
- autovacuum_vacuum_insert_scale_factor
Need aitavad käivitada VACUUM-i ka insert-only (ainult lisamiseks) tabelites, muu hulgas selleks, et ridu õigeaegselt külmutada ning nähtavuskaarti ajakohastada.
C. Automaatne statistika värskendamine (ANALYZE)
Automaatne statistika uuendamine käivitub, kui pärast viimast ANALYZE-i lisatud, muudetud või kustutatud ridade arv ületab järgmise lävendi:
autovacuum_analyze_threshold
+ autovacuum_analyze_scale_factor
* tabeli hinnanguline ridade arv
Vaikeseaded on:
- autovacuum_analyze_threshold = 50
- autovacuum_analyze_scale_factor = 0,1
Näiteks 100 000 reaga tabeli puhul:
50 + (0.1 * 100 000) = 10 050
Seega värskendatakse statistikat ligikaudu pärast 10 050 muudatust.
Vaikeseadete korral on ANALYZE lävend üldjuhul madalam kui VACUUM-i lävend.
2. Kuidas vaadata praegusi seadeid ja viimaseid käivitusi?
A. Konfiguratsiooniparameetrite vaatamine
Kõigi autovacuum-iga algavate seadete vaatamiseks:
SELECT name, setting, unit, short_descFROM pg_settingsWHERE name LIKE 'autovacuum%';Üksikute parameetrite väärtuseid saab vaadata näiteks nii:
SHOW autovacuum_naptime;SHOW autovacuum_vacuum_scale_factor;SHOW autovacuum_analyze_scale_factor;B. Millal VACUUM ja ANALYZE tabelil viimati automaatselt käivitusid?
SELECT relname AS tabel, last_autovacuum, last_autoanalyze, autovacuum_count, autoanalyze_countFROM pg_stat_user_tables;last_autovacuum ja last_autoanalyze näitavad viimast automaatset käivitusaega. autovacuum_count ja autoanalyze_count aitavad hinnata, kui sageli neid operatsioone on toimunud.
3. Kuidas sagedust muuta?
Lävendeid saab muuta kahel tasemel:- globaalselt kogu PostgreSQLi andmebaaside kobara jaoks,
- tabelipõhiselt.
A. Tabelipõhine muutmine
Kui tabelis on näiteks 10 miljonit rida, annab vaikimisi 0,2 skaalategur lävendiks:
50 + (0.2 * 10 000 000) = 2 000 050
See võib aktiivse tabeli jaoks olla liiga suur. Sel juhul saab näiteks vähendada skaalategurit:
ALTER TABLE minu_tabelSET (autovacuum_vacuum_scale_factor = 0.05);Statistika sagedasemaks värskendamiseks:
ALTER TABLE minu_tabelSET (autovacuum_analyze_scale_factor = 0.02);Algse seadistuse taastamiseks:
ALTER TABLE minu_tabelRESET (autovacuum_vacuum_scale_factor);B. Globaalne muutmine
Kui soovida muuta vaikeseadeid kogu PostgreSQLi kobara jaoks, saad kasutada näiteks:
ALTER SYSTEM SET autovacuum_vacuum_scale_factor = 0.1;ALTER SYSTEM SET autovacuum_analyze_scale_factor = 0.05;Seejärel laadi konfiguratsioon uuesti:
SELECT pg_reload_conf();Nende parameetrite muutmine ei nõua serveri taaskäivitamist.
ALTER SYSTEM kasutamine eeldab vastavaid õigusi; tavaliselt teeb seda ülikasutaja või kasutaja, kellele on antud vastava parameetri muutmise õigus.