Was ist das Aufblähen von Tabellen in Datenbanken?

9

Kann jemand erklären, was Blähungen in Bezug auf die Datenbank bedeuten? Was bedeutet es zum Beispiel zu sagen, dass ein Index aufgebläht ist? Ich habe versucht, danach zu suchen, aber es gibt keine Erklärung dafür, was Blähungen sind, nur was sie verursachen oder womit sie verursacht werden.

user84643
quelle

Antworten:

16

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 UPDATEoder ausführen, DELETEwird 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 INSERTdann 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 , CLUSTERoder 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 VACUUMEinstellungen 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 .

Kassandry
quelle
-1

Dies bezieht sich wahrscheinlich auf häufige Probleme mit Indizes, bei denen entweder zwei viele Spalten zum Index hinzugefügt werden oder sich überlappende Indizes in einer Tabelle befinden. Das heißt, mehrere Indizes mit demselben Spaltensatz (wodurch einer davon unnötig wird). Ich würde alle Indizes für Tabellen auf überlappende Spalten überprüfen, nach Indizes suchen, die nur Teilmengen anderer Indizes sind, und sie entfernen, wenn Sie feststellen können, dass sie nicht verwendet werden.

Wenn Daten in Tabellen aktualisiert werden, können die Indizes außerdem fragmentiert werden, wodurch sie größer als erforderlich werden. Ich bin nicht mit Postgres vertraut, aber ich vermute, dass es Methoden gibt, um die Indizes zu defragmentieren (indem die Indizes neu erstellt werden), die ihre Größe auf der Festplatte verringern.

Paulbarbin
quelle