sql >> Databáze >  >> RDS >> PostgreSQL

Přehled VACUUM Processing v PostgreSQL

PostgreSQL nepoužívá mechanismus aktualizace IN-PLACE, takže podle toho, jak jsou příkazy DELETE a UPDATE navrženy,

  • Kdykoli jsou provedeny operace DELETE, označí stávající n-tice jako NE- mrtvé namísto fyzického odstranění těchto n-tic.
  • Podobně, kdykoli je provedena operace UPDATE, označí odpovídající existující n-tici jako DEAD a vloží novou n-tici (tj. operace UPDATE =DELETE + INSERT).

Každý příkaz DELETE a UPDATE tedy bude mít za následek jednu DEAD n-tici, která nebude nikdy použita (pokud neexistují paralelní transakce). Tyto mrtvé n-tice povedou ke zbytečnému využití místa navíc, i když stejný nebo menší počet efektivních záznamů. Tomu se v PostgreSQL také říká nadýmání prostoru. Vzhledem k tomu, že PostgreSQL je široce používán jako OLTP druh relačního databázového systému, kde jsou často prováděny operace INSERT, UPDATE a DELETE, bude existovat mnoho DEAD n-tic a tudíž odpovídající důsledky. PostgreSQL tedy vyžadoval silný mechanismus údržby, aby se vypořádal s těmito MRTVÝMI n-ticemi. VACUUM je proces údržby, který se stará o řešení mrtvé n-tice spolu s několika dalšími činnostmi užitečnými pro optimalizaci provozu VACUUM. Pojďme porozumět některé terminologii, která bude použita později v tomto blogu.

Mapa viditelnosti

Jak název napovídá, udržuje informace o viditelnosti o stránkách obsahujících pouze n-tice, o kterých je známo, že jsou viditelné pro všechny aktivní transakce. Pro každou stránku je použit jeden bit. Pokud je bit nastaven na 1, znamená to, že jsou viditelné všechny n-tice odpovídající stránky. Bit nastavený na 0 znamená, že na dané stránce není žádné volné místo a n-tice mohou být viditelné pro všechny transakce.

Mapa viditelnosti je udržována pro každou relaci (tabulku a index) a je přidružena vedle hlavních vztahů, tj. pokud je název uzlu relačního souboru 12345, soubor viditelnosti se uloží do paralelního souboru 12345_vm.

P>

Mapa volného prostoru

Udržuje informace o volném místě obsahující podrobnosti o dostupném prostoru ve vztahu. To je také uloženo v souboru paralelně k hlavnímu souboru relací, tj. pokud je název uzlu relačního souboru 12345, pak se soubor mapy volného místa uloží do paralelního souboru 12345_fsm.

Zmrazit n-tice

PostgreSQL používá 4 bajty pro uložení ID transakce, což znamená, že lze vygenerovat maximálně 2 miliardy transakcí, než se to zabalí. Nyní zvažte, že v tuto chvíli nějaká n-tice obsahuje počáteční ID transakce, řekněme 100, pak pro novou transakci (která používá zabalenou transakci) řekněme 5, ID transakce 100 se podívá do budoucnosti a nebude moci vidět přidaná data. /modifikováno, i když to bylo ve skutečnosti v minulosti. Aby se zabránilo této speciální transakci, je přiděleno id FrozenTransactionId (rovné 2). Toto speciální ID transakce je vždy považováno za minulé a bude viditelné pro všechny transakce.

VAKUUM

Primární úlohou VACUUM je získat zpět úložný prostor obsazený MRTVÝMI n-ticemi. Rekultivovaný úložný prostor není vrácen operačnímu systému, ale je pouze defragmentován na stejné stránce, takže je pouze k dispozici pro opětovné použití pro budoucí vkládání dat do stejné tabulky. Zatímco operace VACUUM probíhá na konkrétním stole, lze současně provádět další operace ČTENÍ/ZÁPIS na stejném stole, protože na konkrétním stole není použit výhradní zámek. V případě, že není zadán název tabulky, bude VACUUM provedeno na všech tabulkách databáze. Operace VACUUM se provádí pod řadou operací v rámci zámku ShareUpdateExclusive:

  • Prohledejte všechny stránky všech tabulek (nebo zadané tabulky) databáze a získejte všechny mrtvé n-tice.
  • V případě potřeby zmrazte staré n-tice.
  • Odstraňte indexovou n-tice ukazující na příslušné MRTVÉ n-tice.
  • Odstraňte MRTVÉ n-tice stránky odpovídající konkrétní tabulce a přerozdělte živé n-tice na stránce.
  • Aktualizujte mapu volného místa (FSM) a mapu viditelnosti (VM).
  • Pokud je to možné, zkraťte poslední stránku (pokud byly uvolněny MRTVÉ n-tice).
  • Aktualizujte všechny odpovídající systémové tabulky.

Jak vidíme z výše uvedených kroků práce pro VACUUM, je jasné, že jde o velmi nákladnou operaci, protože potřebuje zpracovat všechny stránky vztahu. Je tedy velmi potřeba přeskakovat případné stránky, které nevyžadují vysávání. Vzhledem k tomu, že mapa viditelnosti (VM) poskytuje informace o stránce, kde není volné místo, lze předpokládat, že odpovídající vakuum na stránce není nutné, a proto lze tuto stránku bezpečně přeskočit.

Vzhledem k tomu, že VACUUM tak jako tak prochází všemi stránkami a jejich všemi n-ticemi, využívá příležitost provést další důležitý úkol – zmrazení kvalifikačních n-tic.

Úplné VAKUUM

Jak bylo diskutováno v předchozí části, i když VACUUM odstraní všechny MRTVÉ n-tice a defragmentuje stránku pro budoucí použití, nepomůže to snížit celkové úložiště tabulky, protože prostor ve skutečnosti není uvolněn pro operační systém. Předpokládejme, že tabulka tbl1, že celkové úložiště dosáhlo 1,5 GB az tohoto 1 GB je obsazeno mrtvými n-ticemi, pak po VACUUM bude k dispozici další přibližně 1 GB pro další vložení n-tice, ale přesto celkové úložiště zůstane 1,5 GB.

Full VACUUM řeší tento problém tím, že ve skutečnosti uvolní místo a vrátí jej zpět do operačního systému. Ale to něco stojí. Na rozdíl od VACUUM, FULL VACUUM neumožňuje paralelní provoz, protože vyžaduje výhradní zámek na relaci, která dostává FULL VACUUM. Níže jsou kroky:

  • Zaujme výhradní zámek na vztahu.
  • Vytvořte paralelní prázdný soubor úložiště.
  • Zkopírujte všechny živé n-tice z aktuálního úložiště do nově přiděleného úložiště.
  • Pak uvolněte původní úložiště.
  • Uvolněte zámek.

Jak je tedy také zřejmé z kroků, bude mít úložiště potřebné pouze pro zbývající data.

Automatické VAKUUM

Místo ručního provádění VACUUM podporuje PostgreSQL démona, který pravidelně automaticky spouští VACUUM. Pokaždé, když se VACUUM probudí (ve výchozím nastavení 1 minuta), vyvolá několik prací (v závislosti na konfiguraci procesů autovacuum_worker).

Pracovníci automatického vysávání provádějí procesy VAKUUM souběžně pro příslušné určené stoly. Vzhledem k tomu, že VACUUM nepoužívá žádné výhradní uzamčení tabulek, neovlivňuje (nebo jen minimálně) jinou práci s databázemi.

Konfigurace Auto-VACUUM by měla být provedena na základě vzoru používání databáze. Nemělo by to být příliš časté (protože to ztratí probuzení pracovníka, protože nemusí existovat nebo je příliš málo mrtvých n-tic) nebo příliš zpožděné (způsobí to mnoho mrtvých n-tic dohromady a tím pádem nadýmání stolu).

VACUUM nebo Full VACUUM

V ideálním případě by databázová aplikace měla být navržena tak, aby nebylo potřeba PLNÉ VAKUUM. Jak bylo vysvětleno výše, FULL VACUUM znovu vytvoří úložný prostor a vrátí data zpět, takže pokud je pouze méně mrtvých n-tic, bude úložný prostor okamžitě znovu vytvořen, aby se vrátila všechna původní data. Vzhledem k tomu, že FULL VACUUM využívá exkluzivní zámek na stole, blokuje všechny operace na odpovídajícím stole. Takže provádění FULL VACUUM může někdy zpomalit celkovou databázi.

V souhrnu byste se měli vyhnout plnému VACUUM, pokud není známo, že většinu úložného prostoru tvoří mrtvé n-tice. PostgreSQL rozšíření pg_freespacemap může být použito k získání férové ​​rady ohledně volného místa.

Podívejme se na příklad vysvětleného procesu VACUUM.

Nejprve vytvoříme ukázku tabulky1:

postgres=# create table demo1(id int, id2 int);

CREATE TABLE

A vložte tam nějaká data:

postgres=# insert into demo1 values(generate_series(1,10000), generate_series(1,

10000));

INSERT 0 10000

postgres=# SELECT count(*) as npages, round(100 * avg(avail)/8192 ,2) as average_freespace_ratio FROM pg_freespace('demo1');

 npages | average_freespace_ratio

--------+-------------------------

  45 |                0.00

(1 row)

Nyní smažeme data:

postgres=# delete from demo1 where id%2=0;

DELETE 5000

A spusťte ruční vysavač:

postgres=# vacuum demo1;

VACUUM

postgres=# SELECT count(*) as npages, round(100 * avg(avail)/8192 ,2) as average_freespace_ratio FROM pg_freespace('demo1');

 npages | average_freespace_ratio

--------+-------------------------

  45 |               45.07

(1 row)

Tento volný prostor je nyní k dispozici pro opětovné použití PostgreSQL, ale pokud chcete uvolnit tento prostor pro operační systém, spusťte:

postgres=# vacuum full demo1;

VACUUM

postgres=# SELECT count(*) as npages, round(100 * avg(avail)/8192 ,2) as average_freespace_ratio FROM pg_freespace('demo1');

 npages | average_freespace_ratio

--------+-------------------------

  23 |                0.00

(1 row)

Závěr

A toto byla krátká ukázka toho, jak proces VAKUUM funguje. Naštěstí díky procesu automatického vysávání, většinu času a v běžném prostředí PostgreSQL, na to nemusíte myslet, protože to spravuje samotný engine.


  1. Příklad zlepšení výkonu dotazů pomocí indexů

  2. Použití Barmana k zálohování PostgreSQL - přehled

  3. SQLite UNIQUE omezení

  4. Jak funguje modulo operátor v MariaDB