PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Postgres riscrive l'intera riga durante l'aggiornamento?

Selezione c) dalle tue domande:

Come @Craig ha già spiegato , le colonne che sono "abilitate a TOAST" e più grandi di una certa soglia vengono memorizzate fuori linea in una tabella TOAST dedicata per tabella (separati "fork di relazione", file separati su disco). Quindi, un bytea da 5 MB la colonna rimarrebbe per lo più intatta in un aggiornamento se la colonna stessa non viene modificata. Il manuale:

Enfasi in grassetto mio.
La riga nel fork della relazione principale viene ancora copiata e una riga morta rimane indietro quando viene aggiornata (indipendentemente dal fatto che i valori siano effettivamente modificati). Per righe di grandi dimensioni, potrebbe essere utile la seguente soluzione:

Crea una piccola tabella 1:1 separata per i flag cambiati di frequente. Solo la chiave primaria (=chiave esterna allo stesso tempo) e i flag modificati di frequente. Ciò renderebbe gli aggiornamenti molto più veloci e conserverebbe lo spazio su disco, per un sovraccarico iniziale aggiuntivo e alcuni costi per le query che devono unire entrambe le tabelle (altre query in realtà diventano più veloci). Ulteriori informazioni sui requisiti di spazio su disco delle righe della tabella: