Abhängig davon, wie viele verschiedene Datensätze vorhanden sind, besteht eine Option darin, die Tabellen pro Datensatz zu partitionieren.
Wenn ein Datensatz aktualisiert wird, werden BEGIN
eine neue Transaktion, TRUNCATE
die Tabelle, COPY
die neuen Daten darin und COMMIT
. PostgreSQL hat eine Optimierung , wo COPY
in eine Tabelle , die ing gewesen TRUNCATE
d in derselben Transaktion kann noch viel weniger I / O , wenn Sie verwenden wal_level = minimal
(Standardeinstellung).
Wenn Sie nicht partitionieren und abschneiden können (z. B. wenn Sie mit Zehntausenden oder Hunderttausenden von Datensätzen arbeiten, in denen es einfach zu viele Tabellen gibt), möchten Sie stattdessen das Autovakuum hochdrehen, um so viel wie möglich auszuführen Stellen Sie sicher, dass Sie gute Indizes für alles haben, was Sie basierend auf löschen, und seien Sie auf eine etwas normale Leistung vorbereitet.
Wenn Sie keine Absturzsicherheit benötigen - es macht Ihnen nichts aus, dass Ihre Tabellen nach einem Systemabsturz leer sind -, können Sie Ihre Tabellen auch als erstellen UNLOGGED
, wodurch Sie eine enorme Menge an E / A-Kosten sparen.
Wenn es Ihnen nichts ausmacht, nach einem Systemabsturz das gesamte Setup aus einem Backup wiederherzustellen, können Sie einen Schritt weiter gehen und auch festlegen fsync=off
, was PostgreSQL im Grunde sagt: "Kümmern Sie sich nicht um die Absturzsicherheit, ich habe gute Backups und ich ziehe nicht an." Es ist mir egal, ob meine Daten nach einem Absturz dauerhaft und vollständig nicht wiederherstellbar sind, und ich bin froh, sie erneut zu verwenden, initdb
bevor ich meine Datenbank wieder verwenden kann. "
Ich habe in einem ähnlichen Thread über Stack Overflow mehr darüber geschrieben, wie man PostgreSQL für schnelle Tests optimiert . Dies erwähnt die Optimierung des Host-Betriebssystems und die Trennung von WAL auf eine andere Festplatte, wenn Sie keine unlogged
Tabellen, Checkpointer-Anpassungen usw. verwenden.
Es gibt auch einige Informationen in den Pg-Dokumenten für schnelles Laden von Daten und nicht dauerhafte Einstellungen .
SIGKILL
usw.), können alleUNLOGGED
TabellenTRUNCATE
d sein, sodass sie beim Start leer sind. Sie werden nach einem sauberen Herunterfahren und Neustart nicht abgeschnitten, aber Sie sollten sich nicht darauf verlassen, dass sie dauerhaft sind.UNLOGGED
Option pro Tisch zu haben ist einfach großartig.TRUNCATE
oder in welcherDROP/CREATE TABLE
Reihenfolge?TRUNCATE
persönlich empfehlen . DDL-Abwanderung hat ihre eigenen Kosten. Da Sie häufig Änderungen mit einem so hohen Wert vornehmen, ist es sehr wichtig sicherzustellen, dass Sie die Aggressivität von Autovacuum aufpg_catalog.pg_class
und anderen Systemtabellen erhöhen, die unter dieser Arbeitslast möglicherweise aufblähen.