Skip to content
industry insights

Der Trick von Postgres 19 zum Verkleinern von Tabellen hat einen Haken

Eine routinemäßige Bereinigung könnte bald Speicherplatz freigeben, ohne einen Ausfall zu erzwingen. Doch eine kurze Sperre kurz vor dem Ziel kann eine lang laufende Abfrage zum Verkehrsstau werden lassen.

Stork editorial team
Der Trick von Postgres 19 zum Verkleinern von Tabellen hat einen Haken

Warum gelöschte Zeilen Ihre Datenbank nicht verkleinern

Die Multi-Version-Concurrency-Control-Architektur (MVCC) von PostgreSQLQL ist grundlegend für nebenläufige Datenbankoperationen, bringt aber unvermeidliche Kosten mit sich: Tabellen-Bloat. Wird eine Zeile aktualisiert, ändert PostgreSQLQL sie nicht an Ort und Stelle, sondern schreibt eine völlig neue Kopie und markiert die alte Version als „dead“. Dieser Mechanismus stellt sicher, dass Transaktionen stets einen konsistenten Snapshot der Daten sehen, hinterlässt jedoch eine Spur veralteter Daten.

Irgendwann bereinigen VACUUM-Prozesse diese toten Zeilen, sodass ihr Speicherplatz innerhalb derselben Tabelle für neue Daten zur Verfügung steht. Entscheidend ist: Ein routinemäßiges VACUUM gibt diesen zurückgewonnenen Speicherplatz nicht an das Betriebssystem zurück. Wenn Sie die Hälfte Ihrer Tabelle löschen, behält die Datei auf der Festplatte häufig dieselbe Größe – eine häufige Quelle von Frustration für DBAs.

Bisher war VACUUM FULL die einzige integrierte Möglichkeit, eine Tabelle physisch zu verkleinern und Speicherplatz an das Betriebssystem zurückzugeben. Dieser Befehl schreibt die gesamte Tabelle neu und verdichtet sie auf neuen Datenseiten. VACUUM FULL setzt jedoch eine ACCESS EXCLUSIVE-Sperre, die alle Lese- und Schreibzugriffe auf die Tabelle bis zum Abschluss blockiert – eine so gravierende Folge, dass selbst die eigene Dokumentation von PostgreSQLQL von der Verwendung in Produktionsumgebungen abrät. Dadurch waren DBAs für die Online-Verdichtung von Tabellen auf Erweiterungen von Drittanbietern wie pg_repack angewiesen.

REPACK verlagert die aufwendige Arbeit weg vom kritischen Pfad

PostgreSQLQL 19 bietet DBAs endlich eine integrierte Online-Lösung gegen Tabellen-Bloat: REPACK CONCURRENTLY. Dieser Befehl umgeht das blockierende VACUUM FULL, indem er eine neue, kompakte Version einer Tabelle erstellt und gleichzeitig Lese- und Schreibzugriffe auf das Original zulässt. Das ist ein Wendepunkt, um die Performance ohne Ausfallzeit zu erhalten.

Der Mechanismus ist clever: REPACK kopiert zunächst alle aktiven Zeilen in eine neue, temporäre Tabelle. Anschließend nutzt es WAL-basierte logische Dekodierung, um alle Änderungen (Inserts, Updates, Deletes) zu erfassen, die während dieser Kopierphase an der ursprünglichen Tabelle vorgenommen wurden. Diese erfassten Änderungen werden auf die neue Tabelle übertragen, sodass die Ersatztabelle vollständig aktuell ist.

Schließlich setzt REPACK kurzzeitig eine exklusive Sperre, um die alte Tabellendatei atomar gegen die neue, kompakte auszutauschen. Dadurch wird das kritische Zeitfenster, in dem die Tabelle nicht verfügbar ist, minimiert. Im Test von Better Stack schrumpfte eine 493 MB große Tabelle in unter 10 Sekunden auf 228 MB und blieb dabei bis zum letzten, kurzen Umschalten zugänglich. Dies ist kein allgemeingültiger Benchmark, zeigt aber die erhebliche Platzersparnis und betriebliche Effizienz, die REPACK bietet.

Die winzige Sperre, die einen großen Verkehrsstau auslösen kann

REPACK CONCURRENTLY wirkt nicht magisch; es verlagert lediglich die aufwendige Arbeit. Während der Großteil des Tabellenkopierens online abläuft, erfordert der abschließende, entscheidende Schritt – der Austausch der alten Tabellendatei gegen die neue, verdichtete Version – eine exklusive Sperre. Diese ACCESS EXCLUSIVE-Sperre verhindert jegliche gleichzeitigen Operationen auf der Tabelle, ob Lese- oder Schreibzugriffe. Das Zeitfenster ist winzig und atomar, muss aber warten, bis jede einzelne aktive Transaktion, die diese Tabelle berührt, abgeschlossen ist.

Dieser Engpass birgt ein erhebliches betriebliches Risiko. Ein Test von Better Stack hat dies deutlich gezeigt: Ein 20 Sekunden dauernder analytischer Bericht, der während des Umschaltens aktiv war, verzögerte den abschließenden Austausch. Dadurch mussten alle nachfolgenden Abfragen auf diese Tabelle volle 18 Sekunden in der Warteschlange warten, was effektiv ein Head-of-Line-Blocking-Szenario erzeugte. Das Versprechen des Online-Repackings wird geschmälert, wenn eine einzelne lang laufende Abfrage nebenläufige Operationen aus dem Tritt bringen kann.

Um dem entgegenzuwirken, sollten Sie das abschließende Umschalten als kritisches Ereignis behandeln. Planen Sie REPACK CONCURRENTLY außerhalb der Spitzenzeiten ein, wenn lang laufende Berichte oder Batch-Jobs voraussichtlich nicht um die Tabelle konkurrieren. Prüfen Sie vor dem Start des Befehls vorab, ob aktive Sitzungen auf der Zieltabelle laufen, oder ziehen Sie Ressourcen wie die PostgreSQLQL Documentation: Routine Vacuuming heran, um mehr über die Tabellenwartung zu erfahren. Ziel ist es, dass der Metadaten-Austausch ohne unerwartete Verzögerungen erfolgt und aus einem cleveren Trick ein verlässliches Betriebswerkzeug wird.

Gefällt Ihnen der Artikel? Erhalten Sie jeden Morgen einen wie diesen per E-Mail.

eine E-Mail pro Tag · Abmeldung mit zwei Klicks · kein Tracking durch Dritte

Ein natives Werkzeug, aber kein Grund, auf Planung zu verzichten

Das native REPACK CONCURRENTLY in PostgreSQLQL 19 ist eine überzeugende Alternative zu Werkzeugen von Drittanbietern wie pg_repack, das seit über einem Jahrzehnt fester Bestandteil der Community ist. Die integrierte Unterstützung vereinfacht die Verwaltung von Erweiterungen, vermeidet Kompatibilitätsprobleme und verbessert möglicherweise die Integration in zentrale Datenbankoperationen. Diese Entwicklung spiegelt einen wachsenden Trend wider, wichtige DBA-Funktionen in den Kern zu übernehmen.

„Nativ“ bedeutet jedoch nicht „Zauberei“. Zwar nennt das Better-Stack-Video als angestrebtes Veröffentlichungsdatum für PostgreSQLQL 19 den 19. November, doch sollten Anwender vor jeder Migrationsplanung den aktuellen Release-Status und die Unterstützung durch den Anbieter prüfen. Insbesondere bei Managed Services kann die Einführung neuer Funktionen sich verzögern oder neue Befehle können eingeschränkt sein; bestätigen Sie die Möglichkeiten daher immer bei Ihrem jeweiligen Anbieter.

Der Entwicklungsweg von PostgreSQLQL 19 war, wie das Video anmerkt, „holprig“: Funktionen wurden angekündigt, gestrichen und zugunsten der Stabilität zurückgenommen. Dieses vorsichtige Vorgehen ist typisch für die PostgreSQLQL Global Development Group. Bevor Sie sich daher für Produktions-Workloads auf REPACK CONCURRENTLY verlassen, sollten Sie das genaue Verhalten und etwaige betriebliche Einschränkungen in der offiziellen Dokumentation von PostgreSQLQL 19 bestätigen.

Letztlich ist REPACK CONCURRENTLY ein leistungsfähiges neues Werkzeug im Köcher des DBA, aber keine Patentlösung. Die kurze, aber kritische exklusive Sperre bedeutet, dass strategische Planung weiterhin unerlässlich ist. Wer es in Zeitfenstern mit geringer Aktivität oder ohne lang laufende Abfragen ausführt, nutzt seinen Nutzen am besten aus und vermeidet die in den Tests von Better Stack beobachtete Warteschlange von 18 Sekunden.

Häufig gestellte Fragen

Was bewirkt REPACK in PostgreSQL 19?

REPACK baut eine Tabelle in ein kompakteres physisches Layout um und gibt dabei nicht genutzten Speicherplatz frei, während der normale Datenbankbetrieb weiterlaufen kann.

Wie unterscheidet sich REPACK von VACUUM FULL?

VACUUM FULL schreibt eine Tabelle neu und hält dabei für die Dauer des Vorgangs eine blockierende Sperre. REPACK CONCURRENTLY erledigt den Großteil der Arbeit, während die Tabelle weiterhin zugänglich bleibt, und benötigt dann nur eine kurze exklusive Sperre, um die Dateien auszutauschen.

Kann REPACK CONCURRENTLY dennoch den Anwendungsverkehr beeinträchtigen?

Ja. Der abschließende Austausch muss warten, bis Abfragen, die die Tabelle verwenden, abgeschlossen sind, und neue Anfragen können sich hinter der Sperre in einer Warteschlange anstauen.

Macht PostgreSQL 19 pg_repack überflüssig?

In manchen Fällen kann es den Bedarf an pg_repack verringern, doch Teams sollten die Verfügbarkeit und die betriebliche Eignung der integrierten Funktion mit ihren bestehenden Werkzeugen vergleichen.

Found this useful? Share it.

For builders

Want Stork to write one of these about your product?

Send us a URL. We use the product, form a view, and publish what we actually think — in 8 languages, labeled Sponsored, with no copy approval on your side. That last part is what makes it worth quoting.

See how it works$199 · AI tools & software only

Für Builder

Diese Seite arbeitet gerade für das Tool von jemand anderem.

KI-Agenten lesen sie. Käufer landen darauf. Sie antwortet in acht Sprachen und über MCP. Dein Tool kann so eine haben — in 24 Stunden live.