News zu Post­greS­QL Datenbank

DBA-Pra­xis­­test: Post­greS­QL 19 pg_plan_advice im Labortest

Mit pg_plan_advice Aus­füh­rungs­plä­ne gezielt be­ein­flus­sen und Vorgaben mit pg_stash_advice speichern: Wir haben un­ter­sucht, was das für die Ab­fra­ge­per­for­mance bedeutet – und wo die Grenzen liegen.

Index Scan oder Seq Scan? Hash Join oder Nested Loop? Nor­ma­ler­wei­se ent­schei­det der Post­greS­QL-Planner, welcher Aus­füh­rungs­plan vor­aus­sicht­lich am güns­tigs­ten ist. Doch was tun, wenn eine Abfrage auffällig langsam läuft und ein anderer Plan bessere Er­geb­nis­se verspricht?

PostgreSQL

pg_plan_advice und pg_stash_advice im DBA-Test

Genau hier kommen pg_plan_advice und pg_stash_advice ins Spiel: Mit pg_plan_advice lassen sich bestimmte Planner-Ent­schei­dun­gen gezielt be­ein­flus­sen – etwa die Zu­griffs­me­tho­de, Join-Rei­hen­fol­ge oder das Join-Verfahren. Das Modul schränkt dabei die Auswahl des Planners ein. pg_stash_advice ergänzt die Mög­lich­keit, solche Vorgaben einer Query-ID zu­zu­ord­nen und bei der Planung passender Abfragen au­to­ma­tisch anzuwenden.

Wir haben beide Werkzeuge mit Post­greS­QL 19beta3 im Labor getestet. Die wich­tigs­te Er­kennt­nis: Mehr Kontrolle über den Aus­füh­rungs­plan bedeutet nicht au­to­ma­tisch mehr Performance.

Unser Test­auf­bau mit Post­greS­QL 19beta3

Getestet wurde auf einer einzelnen VMware-Instanz mit 16 vir­tu­el­len CPUs und 64 GB RAM. Post­greS­QL war mit 128 MiB shared_buffers und bis zu zwei par­al­le­len Workern pro Abfrage konfiguriert.

Die künst­li­che Da­ten­ba­sis bestand aus 500.000 Ver­kaufs­da­ten­sät­zen sowie Kunden‑, Produkt- und Da­tums­ta­bel­len. Wir ver­gli­chen die freie Plan­ner­wahl mit gezielten Vorgaben für Zu­griffs­me­tho­den und Joins. Hinzu kamen Tests mit ge­än­der­ter Da­ten­ver­tei­lung und ge­spei­cher­ten Vorgaben.

Die voll­stän­di­gen Ver­gleichs­se­ri­en ent­hiel­ten jeweils zwei Auf­wärm­läu­fe und zehn Messungen pro Variante. Insgesamt ent­stan­den 471 ver­wert­ba­re Messungen. Zu­sätz­lich prüften wir, ob die Abfragen weiterhin dieselben Er­geb­nis­se lieferten.

Welche Aus­wir­kun­gen hatten die Planvorgaben?

Index Scan oder Seq Scan: Die Tref­fer­men­ge zählt

Bei einer Abfrage mit hoher Se­lek­ti­vi­ät benötigte ein er­zwun­ge­ner voll­stän­di­ger Ta­bel­len­scan rund 33 statt 0,14 Mil­li­se­kun­den. Mehrere vor­ge­ge­be­ne Join-Verfahren machten die un­ter­such­ten Abfragen ebenfalls langsamer.

Die prak­ti­sche Kon­se­quenz: Dass eine Vorgabe an­ge­wen­det wird, sagt noch nichts über ihren Nutzen aus. Ent­schei­dend ist der gemessene Vergleich mit der freien Plannerwahl.

Ein passender Index brachte einen deut­li­chen Vorteil

Beim Pro­dukt­fil­ter sank die Laufzeit mit einem passenden Index von etwa 48 auf 1,26 Mil­li­se­kun­den, jeweils als Median gemessen.

Die Werte stammen aus ge­trenn­ten Mess­se­ri­en. Zu­sätz­li­cher Spei­cher­be­darf und Schreib­auf­wand durch den Index wurden nicht un­ter­sucht. Trotzdem un­ter­streicht das Ergebnis: Zur Post­greS­QL-Query-Op­ti­mie­rung gehört zunächst die Prüfung von Sta­tis­ti­ken, Ab­fra­ge­struk­tur und vor­han­de­nen Indizes.

Worauf solltest du bei pg_stash_advice achten?

Gleiche Query-ID bedeutet nicht gleicher optimaler Plan

Abfragen mit un­ter­schied­li­chen Such­wer­ten können dieselbe Query-ID besitzen, obwohl ver­schie­de­ne Aus­füh­rungs­plä­ne sinnvoll wären. Ein Filter auf ein seltenes Produkt kann bei­spiels­wei­se von einem anderen Zugriff pro­fi­tie­ren als ein Filter auf einen häufig vor­kom­men­den Wert.

Eine ge­spei­cher­te Plan­vor­ga­be sollte deshalb mit re­prä­sen­ta­ti­ven Such­wer­ten geprüft werden. Nach Än­de­run­gen der Da­ten­ver­tei­lung ist erneut zu bewerten, ob sie weiterhin einen Vorteil bringt.

Gelöschte Vorgaben können über zwi­schen­ge­spei­cher­te Pläne nachwirken

Im Labor zeigte sich: Nach dem Entfernen einer ge­spei­cher­ten Vorgabe kann ein bereits zwi­schen­ge­spei­cher­ter Aus­füh­rungs­plan wei­ter­ver­wen­det werden.

Zum Rück­nah­me­weg gehört daher die Kontrolle, welcher Plan an­schlie­ßend tat­säch­lich aus­ge­führt wird. Ein ge­lösch­ter Advice-Eintrag allein belegt noch nicht, dass wieder ein un­be­ein­fluss­ter Plan zum Einsatz kommt.

Unser Tipp zur PostgreSQL-Query-Optimierung

Bevor du eine Plan­vor­ga­be dauerhaft einsetzt, empfiehlt sich dieses Vorgehen:

  1. Aus­gangs­la­ge prüfen:
    Sta­tis­ti­ken, Indizes und Ab­fra­ge­struk­tur untersuchen.
  2. Gezielt ein­grei­fen:
    Nur die Planner-Ent­schei­dun­gen be­ein­flus­sen, für die es einen be­grün­de­ten Anlass gibt.
  3. Wie­der­holt ver­glei­chen:
    Die Variante gegen die freie Plan­ner­wahl messen und un­ter­schied­li­che Suchwerte berücksichtigen.
  4. Er­geb­nis­se kon­trol­lie­ren:
    Neben der Laufzeit auch die Er­geb­nis­gleich­heit prüfen.
  5. Wirkung nach­ver­fol­gen:
    Nach Da­ten­än­de­run­gen erneut testen und bei einer Rücknahme auch zwi­schen­ge­spei­cher­te Pläne kontrollieren.

Ausblick: KI-gestützte Abfrageoptimierung

Ein möglicher Fol­ge­ver­such wäre ein kon­trol­lier­ter, KI-ge­stütz­ter Op­ti­mie­rungs­kreis­lauf. Dabei würde KI auffällig langsame Abfragen anhand ihrer Lauf­zeit­da­ten erkennen, Aus­gangs­plä­ne ana­ly­sie­ren und wenige be­grün­de­te Al­ter­na­ti­ven mit pg_plan_advice testen.

Nur eine wie­der­holt bessere Vorgabe würde nach Prüfung ver­schie­de­ner Suchwerte und der Er­geb­nis­gleich­heit über pg_stash_advice für einen be­grenz­ten Test­be­trieb hin­ter­legt. An­schlie­ßend müsste sie re­gel­mä­ßig mit der freien Plan­ner­wahl ver­gli­chen und bei Ver­schlech­te­run­gen zu­rück­ge­nom­men werden.

Dieser Kreislauf war nicht Be­stand­teil des be­schrie­be­nen La­bor­tests. Ziel eines Fol­ge­ver­suchs wäre eine über­prüf­ba­re Op­ti­mie­rung, die auch erkennt, wann ihre eigene Emp­feh­lung nicht mehr sinnvoll ist.

Fazit: Plan Advice gezielt einsetzen und re­gel­mä­ßig prüfen

pg_plan_advice und pg_stash_advice bieten zu­sätz­li­che Mög­lich­kei­ten, Post­greS­QL-Aus­füh­rungs­plä­ne zu be­ein­flus­sen und nach­ge­wie­se­ne Pla­nungs­pro­ble­me zu be­ar­bei­ten. Gute Sta­tis­ti­ken, passende Indizes und be­last­ba­re Ver­gleichs­mes­sun­gen bleiben dabei entscheidend.

Unsere Er­geb­nis­se beziehen sich auf den be­schrie­be­nen Post­greS­QL-19beta3-La­bor­auf­bau. Sie lassen sich nicht pauschal auf andere Versionen oder pro­duk­ti­ve Um­ge­bun­gen übertragen.

Du möchtest langsame Post­greS­QL-Abfragen ana­ly­sie­ren oder das Op­ti­mie­rungs­po­ten­zi­al deiner Aus­füh­rungs­plä­ne bewerten lassen? Unsere Post­greS­QL-DBAs un­ter­stüt­zen dich dabei, Ursachen ein­zu­gren­zen und geeignete Maßnahmen für deine Umgebung zu prüfen.

Hier findest du weitere Infos aus der Welt von Post­greS­QL aus unserem News & Insights Bereich.

icon-arrow_right_medium-violet-blue.svg

Share this article

Facebook 
Twitter 
LinkedIn 
XING 
WhatsApp 
Email