Donnerstag, März 22, 2018

Local Partitioned Indexes mit postgres 11

Daniel Westermann weist darauf hin, das postgres 11 erweiterte Optionen für die Indizierung partitionierter Tabellen liefern. Während in postgres 10 Indizes noch auf Partitionsebene erzeugt werden mussten, kann man sie jetzt für die partitionierte Tabelle definieren, was dazu führt, dass sie automatisch in den untergeordneten Partitionstabellen erzeugt werden. Vielleicht noch interessanter ist die Möglichkeit, primary keys auf partitionierten Tabellen zu erzeugen. Insgesamt ist deutlich zu erkennen, dass die Partitionierung in postgres allmählich ihre Kinderkrankheiten hinter sich lässt.

Nachtrag 26.03.2018: zu den Ergänzungen gehört auch das row movement - also die Verschiebung eines Datensatzes in eine andere Partition bei Änderung des Werts für den partition key. Auch dazu hat der Herr Westermann einen Artikel geschrieben.

Nachtrag 04.04.2018: und noch etwas, das in postgres 11 funktioniert: die postgres-Variante zum Merge-Statement - das "Insert ... on conflict".  Auch dazu hat der Herr Westermann einen Artikel geliefert.

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.