CONGELAMENTO SOTTO VUOTO vs. VUOTO COMPLETO


18

Qualcuno può spiegare la differenza tra questi tipi di VACUUMin PostgreSQL?

Ho letto il documento ma dice solo che FULLblocca le tabelle e FREEZE"congela" le tuple. Penso che sia lo stesso. Ho sbagliato?


Hai letto il documento? Sarebbe l'occasione perfetta per includere un link a quello che hai letto ...
Erwin Brandstetter

Risposte:


12

Ecco una breve risposta concisa.

Vacuum full estrae un blocco esclusivo e ricostruisce la tabella in modo che non abbia blocchi vuoti (per ora facciamo finta che il fattore di riempimento sia del 100%).

Il congelamento sotto vuoto segna il contenuto di una tabella con un timestamp di transazione molto speciale che dice a Postgres che non deve mai essere aspirato. Il prossimo aggiornamento questo ID congelato scomparirà.

Ad esempio, il database template0 è bloccato perché non cambia mai (per impostazione predefinita non è possibile connettersi ad esso.)

Ogni tanto il demone autovacuum controlla un database e le sue tabelle per vedere cosa deve essere aspirato. Se una tabella viene congelata sotto vuoto e non viene mai aggiornata, il demone autovacuum la passerà semplicemente. Anche la protezione "avvolgente" in postgresql non entrerà mai nemmeno su quel tavolo.

tl; dr freezing segna una tabella come non necessitante manutenzione autovac. Il prossimo aggiornamento lo sbloccerà.


Quindi, VACUUM FREEZErichiede un blocco esclusivo sul tavolo? Sembra che dovrebbe, altrimenti rischieresti di rendere improvvisamente visibili le righe delle transazioni attive a livello globale. Potrei fraintenderlo ...
Parthian Shot

Nessun congelamento del vuoto non lo fa, il vuoto completo lo fa.
Scott Marlowe,

6

Per spiegare ulteriormente cosa ha scritto Jayadevan.

Il modo in cui Postgres lavora con le transazioni e per tenere traccia dei dati visibili consiste nel confrontare gli ID delle transazioni interne. Tuttavia, poiché tali transazioni sono un numero intero a 32 bit prima o poi, andranno a finire, e quindi la nuova transazione sembrerà che sia stata effettuata in passato (e quindi sarà visibile in una transazione corrente mentre non dovrebbe), mentre le transazioni più vecchie sembreranno essere eseguite in futuro (e poiché il futuro non esiste ancora, i dati non saranno più visibili).

Quello che Postgres fa per contrastare quel problema è assegnare ad ogni riga che è abbastanza vecchia da essere a rischio di subire da questo avvolgente uno speciale ID transazione che è sempre più vecchio di ogni transazione. Potresti vederlo come se gli ID di transazione validi vanno da 0 a 2147483647, imposterà l'id di transazione per tutte le righe correnti su -1.

Tuttavia, poiché sostanzialmente il vuoto serve a contrassegnare lo spazio vuoto per il riutilizzo, funziona solo su pagine di dati che sono state modificate.

In VACUUM FREEZEpratica, congela l'id della transazione per tutte le pagine, indipendentemente dal fatto che siano state modificate o meno, in modo che tutte le righe correnti vengano considerate vecchie per tutte le nuove transazioni.

Tuttavia, a partire dalla versione 8.2 VACUUM FREEZEsono stati deprecati e non devono essere utilizzati. Esistono invece i parametri vacuum_freeze_table_agee autovacuum_freeze_max_ageche specifica quante transazioni possono verificarsi prima che venga eseguita una scansione completa sulla tabella (effettivamente esegui un interno VACUUM FREEZEsulla tabella).


3
Com'è possibile che i documenti non menzionino di VACUUM FREEZEessere deprecati / scoraggiati?
dezso

Interessante. Lo ha fatto per le versioni tra 8.2 e 9.0. Forse hanno rimosso la deprecazione perché potrebbe essere una buona caratteristica da avere.
Jimmy Stenke,

1

Copia / incolla dalla risposta quando ho posto la stessa domanda: "il vuoto regolare segna lo spazio vuoto per il riutilizzo e recupera lo spazio vuoto alla fine di una relazione. Quindi, se lo spazio vuoto è nel mezzo ecc., Non può essere recuperato appena riutilizzato.

vacuum full compatta una relazione che recupera tutto lo spazio vuoto. Richiede un blocco esclusivo ed è dannoso per i sistemi di produzione in generale per questo motivo.

Quindi lo scopo del vuoto REGOLARE non è quello di recuperare spazio dalle tabelle ma di renderlo disponibile per il riutilizzo in un secondo momento. Lo scopo del vuoto FULL è quello di recuperare tutto lo spazio sprecato a scapito di un blocco esclusivo e prestazioni db mentre sta accadendo.

Quindi, poiché il vuoto regolare non è progettato per recuperare tutto, non dovresti essere sorpreso dal fatto che in realtà non ha recuperato tutto. Prova il tuo esperimento su set di dati più grandi con più eliminazioni casuali ecc. Per vedere la differenza tra vuoto normale e completo. "

http://postgresql.1045698.n5.nabble.com/vacuuming-doubt-td5782828.html

Per aggiungere a ciò, il vuoto completo creerà effettivamente nuovi file per la tabella (i file esistenti si sarebbero ridotti a 0). In questo modo il sistema operativo può recuperare lo spazio.


2
La domanda chiede VACUUM FREEZEin particolare.
Erwin Brandstetter,

Vero - "differenza tra questi tipi di vuoto in PostgreSQL" - Pensavo che la domanda riguardasse le differenze tra i tipi di vuoto.
Jayadevan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.