Montag, März 12, 2018

Postgres: GIN-Indizes und Vacuum

Hans-Jüregen Schönig erläutert in seinem Blog die Rolle der "GIN Pending list" für die Performance von GIN-Indizes. Dazu erläutert er zunächst den Aufbau von GIN-Indizes: diese Indizes bestehen aus einem normalen B*Tree-Index, an den ergänzend ein "posting tree" angehängt ist. Der B*Tree-Index enthält auf Leaf-Ebene einen Eintrag für jedes indizierte Wort, aber die Zuordnung der Wörter zu den pages der zugehörigen Tabelle wird in eine weitere Struktur ausgelagert. Die Verweise in dieser zusätzlichen "posting tree" Struktur werden sortiert gespeichert, so dass eine Anpassung der Struktur potentiell teuer sein kann. Um diese Kosten zu verteilen, werden neue oder geänderte Einträge nicht unmittelbar an die richtige Stelle gebracht, sondern in eine "GIN pending list" ergänzt, die zusätzlich zur Indexstruktur sequentiell gelesen werden muss. Die Zusammenführung von "posting tree" und "pending list" ist Aufgabe des vacuum-Prozesses. Somit können massive DML-Operationen einen signifikanten Einfluss auf die Performance nachfolgender Zugriffe haben, die erfolgen, ehe der nächste Vacuum-Lauf wieder für Ordnung sorgt.

Keine Kommentare:

Kommentar veröffentlichen