Der Teil, den wir an PostgreSQL am meisten hassen
- PostgreSQL hat sich in den letzten fünf Jahren als das im Internet am meisten geliebte DBMS etabliert. Das liegt an seiner Zuverlässigkeit, seinem Funktionsumfang, seiner Erweiterbarkeit und daran, dass es für die meisten produktiven Workloads geeignet ist.
- Die Implementierung der Multiversion Concurrency Control (MVCC) in PostgreSQL gilt im Vergleich zu anderen relationalen DBMS jedoch als die schlechteste.
Was ist Multiversion Concurrency Control?
- Das Ziel von MVCC ist es, dass mehrere Abfragen gleichzeitig aus einer Datenbank lesen und in sie schreiben können, ohne sich gegenseitig zu stören.
- Das DBMS überschreibt bestehende Zeilen nicht, sondern hält mehrere Versionen vor, sodass Abfragen die passende Version auswählen können, um ihre Anfrage zu erfüllen.
- Dieser Ansatz macht explizite Record-Locks überflüssig und ermöglicht es Abfragen, einen Snapshot der Datenbank zu beobachten.
Multiversion Concurrency Control in PostgreSQL
- PostgreSQL verwendet beim Aktualisieren bestehender Zeilen ein append-only-Verfahren zur Versionsspeicherung, bei dem eine neue Version erzeugt wird, um Änderungen anzuwenden.
- Dieser Ansatz verursacht verschiedene komplexe Probleme.
Speicherung mehrerer Versionen
- PostgreSQL speichert alle Zeilenversionen im selben Speicherbereich.
- Bei einem Update wird ein neuer Versionsslot zugewiesen, die bestehende Version kopiert und anschließend die Änderung angewendet.
- PostgreSQL verwendet Versionsketten, um die Beziehungen zwischen den Versionen festzuhalten.
Vacuuming von Versionen
- PostgreSQL verwendet einen Vacuum-Prozess, um alte Versionen zu entfernen.
- Autovacuum läuft regelmäßig und entfernt abgelaufene Versionen, damit Speicherplatz wiederverwendet werden kann.
Warum PostgreSQLs MVCC das schlechteste ist
- Die MVCC-Implementierung von PostgreSQL stammt konzeptionell aus den 1980er-Jahren und passt nicht zu modernen Mustern log-strukturierter Systeme.
- Es werden vier Hauptprobleme erläutert, die bei PostgreSQLs MVCC auftreten.
Problem 1: Kopieren von Versionen
- PostgreSQL kopiert alle Spalten in die neue Version, was die Datenduplizierung und den Speicherbedarf erhöht.
- MySQL und Oracle vermeiden dieses Problem, indem sie Deltas speichern.
Problem 2: Tabellenaufblähung
- Abgelaufene Versionen in PostgreSQL belegen weiterhin Speicherplatz, und wenn Autovacuum sie nicht entfernt, wächst die Datenbank weiter.
- Das verschlechtert die Abfrageleistung.
Problem 3: Wartung sekundärer Indizes
- PostgreSQL muss bei jedem Update alle Indizes aktualisieren.
- Das verschlechtert die Abfrageleistung.
Problem 4: Vacuum-Management
- Die Leistung von PostgreSQL hängt stark davon ab, wie effektiv Autovacuum arbeitet.
- Wenn Autovacuum nicht richtig funktioniert, entstehen Leistungsprobleme.
Zusammenfassung von GN⁺
- PostgreSQL ist weiterhin ein sehr beliebtes DBMS, aber seine MVCC-Implementierung ist nicht modern.
- Die Behebung der MVCC-Probleme von PostgreSQL erfordert viel Zeit und Aufwand.
- Durch die Optimierung der Autovacuum-Einstellungen von PostgreSQL lässt sich die Leistung verbessern.
- Als Alternativen zur Lösung der MVCC-Probleme von PostgreSQL können MySQL und Oracle in Betracht gezogen werden.
1 Kommentare
Hacker-News-Kommentare
OrioleDB versuchte, das Problem mit einer neuen Storage Engine zu lösen
COPY FROMlässt sich dies umgehenDas Design von PostgreSQL ist nicht in jeder Hinsicht schlecht
gitspeichert keine Diffs, sondern wie PostgreSQL vollständige ObjekteDie MVCC-Implementierungen von Oracle und MySQL speichern nicht die physische Adresse der neuen Version
Beim Aktualisieren einer einzelnen Zeile in MySQL ist
SELECT id WHERE something; UPDATE what WHERE id=iddeutlich schnellerIn den 2010er Jahren wurde MongoDB wegen nicht-dauerhafter Schreibvorgänge als "webscale" wahrgenommen
Ich stimme der Erklärung zu
pg_repacknicht zuVACUUM FULList schwergewichtig, aber repack ist eine schnellere und leichtere AlternativePostgreSQL wurde aus folgenden Gründen populär
Es gibt die Frage, ob das Speichern vollständig neuer Zeilen-Tupel-Versionen in PostgreSQL eine Eigenschaft der Standard-Storage-Engine ist
Der Artikel war gut geschrieben und leicht zu lesen und zu verstehen