it-swarm.com.de

Was ist das Aufblähen von Tabellen in Datenbanken?

Kann jemand erklären, was Aufblähen in Bezug auf die Datenbank bedeutet? 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 woran sie liegen.

9
user84643

Aufgrund der Art und Weise, wie PostgreSQL Transaktionen und Parallelität, MVCC - Multi-Version Concurrency Control, verarbeitet, können Sie aufblähen. Wenn Sie in PostgreSQL ein UPDATE oder DELETE ausführen, wird die Zeile nicht physisch gelöscht. Für ein DELETE markiert es einfach die Zeile als nicht verfügbar für zukünftige Transaktionen, und für UPDATE ist es unter der Haube ein kombiniertes INSERT, dann DELETE, wobei Die vorherige Version der Zeile ist als nicht verfügbar markiert.

Obwohl 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 wenn mehr Datendateien für eine Beziehung vorhanden sind, wird zusätzlich unnötig geladen. IO load. Bloat macht sich besonders bei Indizes bemerkbar, die auch viele tote Tupel enthalten können , manchmal viel mehr als die Tabelle. Bloat kann Indexsuchen und -scans verlangsamen, was sich in langsam ansteigenden Abfragezeiten und sich ändernden Abfrageplänen zeigt.

Sie können den Speicherplatz mithilfe von pg_reorg , pg_repack , CLUSTER oder VACUUM FULL Wiederherstellen. 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 Einstellungen für VACUUM 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 zu bestimmen, wie viel Bloat Sie haben, und von dort aus ein wenig Leistungsanalyse durchführen, um zu sehen Wenn Sie Probleme mit der Menge an Blähungen haben, die Sie auf Ihren Tischen haben.

16
Kassandry

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 Satz von Spalten (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 zum Defragmentieren der Indizes gibt (durch Neuerstellen der Indizes), die ihre Größe auf der Festplatte verringern.

0
paulbarbin