Aufgrund der Art und Weise, wie PostgreSQL Transaktionen und Parallelität abwickelt, können Sie sich mit MVCC - Multi-Version Concurrency Control aufblähen. Wenn Sie in PostgreSQL ein UPDATE
oder ausführen, DELETE
wird die Zeile nicht physisch gelöscht. Für ein DELETE
, es ist einfach markiert die Zeile als für zukünftige Transaktionen nicht zur Verfügung, und für UPDATE
, unter der Haube ist es ein kombiniertes INSERT
dann DELETE
, wo die vorherige Version der Zeile nicht verfügbar markiert.
Während die Daten als nicht verfügbar markiert sind, sind sie immer noch vorhanden und der Speicherplatz kann nicht verwendet werden. Um dann den für die Datenbank verfügbaren Speicherplatz als verfügbar zu markieren, muss ein Vakuumprozess hinter den Vorgängen erfolgen und den für die Datenbank verfügbaren Speicherplatz markieren. Es wird jedoch nicht an das Betriebssystem zurückgegeben. Dies geschieht nur, wenn auf einer gesamten Seite keine aktiven Zeilen vorhanden sind, was bei einigen Workloads ungewöhnlich sein kann. Dies kann für einige Workloads eine gute Sache sein, da Sie einfach den Speicherplatz auf den einzelnen Seiten innerhalb der Datendateien aktualisieren können, ohne zusätzliche Datendateien hinzufügen zu müssen.
Probleme treten beim Aufblähen auf, wenn es zu viele tote Tupel im Vergleich zu lebenden Tupeln gibt. Das Durchgehen und Überprüfen aller Sichtbarkeitsflags nimmt Zeit in Anspruch, und mehr Datendateien für eine Beziehung führen zu einer zusätzlichen unnötigen E / A-Belastung. Aufblähen macht sich besonders bei Indizes bemerkbar, die auch viele tote Tupel haben können, manchmal viel mehr als die Tabelle. Bloat kann Indexsuchen und -scans verlangsamen, was sich in langsam steigenden Abfragezeiten und sich ändernden Abfrageplänen zeigt.
Sie können Raum wiederherstellen , indem Sie pg_reorg , pg_repack , CLUSTER
oder VACUUM FULL
. Dadurch werden die Dateien durchlaufen und neu organisiert, Tupel verschoben und neu organisiert, um sicherzustellen, dass keine toten Tupel vorhanden sind, wodurch das Aufblähen beseitigt wird.
Bloat kann auch effizient verwaltet werden, indem die VACUUM
Einstellungen pro Tabelle angepasst werden. Dadurch wird der tote Tupelspeicherplatz markiert, der für die Wiederverwendung durch nachfolgende Abfragen verfügbar ist.
Sie können Abfragen im PostgreSQL-Wiki verwenden, die sich auf Show Database Bloat und Index Bloat beziehen, um festzustellen, wie viel Aufblähung Sie haben, und von dort aus eine Leistungsanalyse durchführen, um festzustellen, ob Sie Probleme mit der Aufblähungsmenge in Ihren Tabellen haben .