Risposte:
Grazie al modo in cui PostgreSQL gestisce le transazioni e la concorrenza, MVCC - Controllo di concorrenza multi-versione, è possibile ottenere un aumento. In PostgreSQL, quando si esegue un UPDATE
o DELETE
, la riga non viene effettivamente eliminata fisicamente. Per a DELETE
, segna semplicemente la riga come non disponibile per le transazioni future e per UPDATE
, sotto il cofano è una combinazione INSERT
quindi DELETE
, in cui la versione precedente della riga è contrassegnata come non disponibile.
Mentre i dati sono contrassegnati come non disponibili, sono ancora lì e lo spazio non può essere utilizzato. Per contrassegnare quindi lo spazio come disponibile per l'uso da parte del database, è necessario un processo di vuoto dietro le operazioni e contrassegnare quello spazio disponibile per l'uso da parte del database. Tuttavia, non viene restituito al sistema operativo. Ciò accade solo quando non ci sono righe attive in un'intera pagina, il che può essere insolito in alcuni carichi di lavoro. Questo può essere una buona cosa per alcuni carichi di lavoro, perché puoi semplicemente aggiornare lo spazio sulle singole pagine all'interno dei file di dati, senza la necessità di aggiungere ulteriori file di dati.
I problemi si verificano con gonfia quando ci sono un numero eccessivamente elevato di tuple morte rispetto a tuple vive. Camminare e controllare tutti i flag di visibilità richiede tempo e avere più file di dati per una relazione comporta un ulteriore carico di I / O non necessario. Il gonfio è particolarmente evidente sugli indici, che possono anche avere molte tuple morte, a volte molte più della tabella. Bloat può rallentare le ricerche e le scansioni dell'indice, che verranno visualizzate aumentando lentamente i tempi delle query e modificando i piani di query.
È possibile ripristinare lo spazio utilizzando pg_reorg , pg_repack , CLUSTER
o VACUUM FULL
. Questo passerà attraverso e riorganizzerà i file, spostando le tuple e riorganizzandoli per assicurarsi che non ci siano tuple morte, che elimineranno il gonfiamento.
Bloat può anche essere gestito in modo efficiente regolando le VACUUM
impostazioni per tabella, il che segna lo spazio di tupla morta disponibile per il riutilizzo da successive query.
Puoi utilizzare le query sul Wiki PostgreSQL relative a Show Database Bloat e Index Bloat per determinare la quantità di gonfiore che hai e, da lì, eseguire un po 'di analisi delle prestazioni per vedere se hai problemi con la quantità di gonfiore che hai sui tuoi tavoli .
Questo probabilmente si riferisce a problemi comuni con gli indici in cui due numerose colonne vengono aggiunte all'indice o ci sono indici sovrapposti su una tabella. Cioè, più indici con lo stesso set di colonne (rendendone inutile una). Vorrei rivedere tutti gli indici su tabelle in cerca di colonne sovrapposte, cercare indici che sono solo sottoinsiemi di altri indici e rimuoverli SE è possibile determinare che non vengono utilizzati.
Inoltre, poiché i dati nelle tabelle vengono aggiornati, gli indici possono diventare frammentati, il che li rende più grandi del necessario. Non ho familiarità con Postgres, ma sospetto che esistano metodi per deframmentare gli indici (ricostruendo gli indici) che ne ridurranno le dimensioni sul disco.