Vastus (01.11.2022 19:18): FILLFACTOR parameetri väärtus määrab kui palju jäetakse tabeli plokkidesse vaba ruumi, et samasse plokki mahuks ära ka UPDATE lausete tulemusena tekkivad ridade uusversioonid. Tabelite puhul on FILLFACTOR parameetri vaikimisi väärtus 100. See tähendab, et tabeli plokid pannakse INSERT lausete tulemusel lisanduvaid ridu täiesti täis ja mingit vaba ruumi plokkidesse ei jäeta. Seega, kui UPDATE lausega muudetakse plokis olevat rida, siis rea uusversioon pannakse teise plokki.
Kui näiteks määrata, et FILLFACTOR on 90, siis jäetakse plokki 10% vaba ruumi. Kui plokk on 90% ulatuses ridadega täidetud, siis INSERT lausetega lisanduvaid ridu sinna plokki enam ei lisata. Kui plokis olevat rida UPDATE lausega muudetakse, siis tekib reast uus versioon ja plokis on ruumi, et see panna sellesse samasse plokki.
FILLFACTOR parameetri väärtust saab muuta ka olemasolevatel tabelitel.
ALTER TABLE Tellimus SET (fillfactor = 90);
Sellisel juhul hakkab see mõjutama uusi tabeli plokke, kuid ei mõjuta olemasolevaid. Seega on loogiline, et olemasolevate plokkide mõjutamiseks tuleb need ümberkorraldada.
Selleks peaks käivitama
VACUUM FULL lause, mille tulemusena kirjutatakse kogu tabeli sisu uude andmefaili. Mida rohkem on tabelis andmeid, seda rohkem võtab see aega. Samuti lukustab see lause tabeli eksklusiivselt, st ükski teine transaktsioon ei saa tabelit samal ajal kasutada.
VACUUM FULL Tellimus;
Alternatiiviks on kasutada laiendust
pg_repack, mille kasutamise korral tabelit eksklusiivselt ei lukustata.