InhaltsverzeichnisKlicke auf den Link, um zur gewünschten Stelle zu navigieren
Dieser Inhalt wurde automatisch aus dem Ukrainischen übersetzt.
In PostgreSQL gibt es einen Mechanismus MVCC (darüber werde ich weiter unten ausführlicher sprechen) - die Mehrversionenfähigkeit von Zeilen. Wenn Sie Daten aktualisieren oder löschen, verschwinden die alten Versionen der Zeilen nicht sofort. Sie bleiben in den Tabellen-Dateien als "tote Last". Mit der Zeit werden es immer mehr solcher Zeilen, die Tabellen blähen sich auf, die Indizes verlieren an Effizienz und die Abfragen beginnen langsamer zu werden.
Um die Datenbank in einem gesunden Zustand zu halten, verwendet PostgreSQL den Prozess VACUUM. Dieser entfernt ungenutzte Versionen von Zeilen, gibt Platz frei und hilft, die Statistiken für den Abfrageplaner zu aktualisieren. Es ist eine Art Reinigung, die man fast nie manuell starten muss, da normalerweise der automatische autovacuum läuft.
Es gibt auch VACUUM FULL - eine radikalere Version. Diese reinigt nicht nur den "Müll", sondern baut die Tabelle auch physisch neu auf und gibt den Platz an das Dateisystem zurück. Der Preis dafür ist eine vollständige Sperrung der Tabelle während der Operation. Daher wird FULL selten verwendet und hauptsächlich in nächtlichen Zeitfenstern oder nach massiven Löschungen.
Ohne VACUUM degradiert PostgreSQL allmählich: die Tabellen wachsen, die Indizes verlieren an Genauigkeit, die Abfragen werden langsam, und autovacuum kann zu aggressiv arbeiten. Daher ist VACUUM nicht nur ein technisches Werkzeug, sondern ein grundlegender Mechanismus, der es PostgreSQL ermöglicht, über viele Jahre hinweg die Leistung aufrechtzuerhalten.
MVCC (Multi-Version Concurrency Control)
MVCC (Multi-Version Concurrency Control) ist eine Methode, mit der PostgreSQL und andere DBMS es vielen Clients ermöglichen, gleichzeitig Daten zu lesen und zu ändern, ohne blockierende Sperren, die die Arbeit lähmen.
In herkömmlichen Datenbanken ohne MVCC können gleichzeitige Schreib- und Lesevorgänge Konflikte erzeugen. MVCC löst dies so: Wenn Sie eine Zeile aktualisieren, schreibt die Datenbank sie nicht über die alte, sondern erstellt eine neue Version. Die alte bleibt für die Transaktionen verfügbar, die sie noch "sehen". Jede Transaktion arbeitet mit ihrem eigenen Snapshot der Daten, ohne anderen in die Quere zu kommen.
Der Vorteil ist einfach - Leser blockieren nicht das Schreiben, und das Schreiben blockiert nicht die Leser. Deshalb kann PostgreSQL eine große Anzahl paralleler Operationen ohne nennenswerte Verzögerungen verarbeiten.
Der Nachteil ist ebenfalls offensichtlich - alte Versionen sammeln sich an. Und genau dafür ist VACUUM verantwortlich, um diese "toten" Zeilen zu entfernen und die Datenbank in einem sauberen Zustand zu halten.
Dieser Beitrag hat noch keine Ergänzungen vom Autor.