PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

In-Place-Updates mit PostgreSQL

Nur inline gespeicherte Felder müssen kopiert werden. Für Felder, die out-of-line in TOAST-Tabellen gespeichert sind, wird nur der Verweis auf den TOAST-Eintrag kopiert.

Ob ein Feld out-of-line gespeichert wird, hängt von der Größe des Werts im Feld und vom Datentyp des Felds ab.

Wenn die Tupel groß sind, aber nur wenige Felder haben - wie

some_id integer,
frequently_updated integer,
charblob text

dann macht es keinen Sinn, irgendetwas zu ändern, weil Updates von frequently_updated schreibt die Daten im Allgemeinen nicht in charblob um , zumindest wenn es groß genug ist, um es zu pflegen.

OTOH, wenn Sie eine Tabelle mit vielen Feldern haben, werden Sie mit jedem Update viel mehr umschreiben.

HOT hilft Ihnen nur bedingt weiter, da ein HOT-Update nur erfolgen kann, wenn keine aktualisierte(n) Spalte(n) Teil eines Index und sind Auf derselben Datenbankseite ist genügend freier Speicherplatz vorhanden. Bei breiten Zeilen passen selbst mit TOAST nicht viele Kopien auf eine Seite, daher ist HOT nur von begrenztem Nutzen.

Es kann sich lohnen, solche Felder in separate Tabellen aufzuteilen, wenn sie wirklich häufig aktualisiert werden, der Rest der Tabelle jedoch breite Zeilen hat, die sich nicht viel ändern.