Franck Pachot erläutert in seinem Blog die unterschiedlichen Straegien bei der Verwendung von Bindevariablen bei Oracle und Postgres. Interessant sind aus meiner Sicht vor allem die Aussagen zu Postgres:
- normalerweise werden Queries bei jeder Ausführung neu optimiert.
- Ausnahme von dieser Regel sind Statements, die prepared wurden.
- Für diese gilt, dass sie bei den ersten fünf Ausführungen jeweils neu kompiliert werden.
- Ab der sechsten Ausführung wird dann ein generischer Plan verwendet, der sich aber nicht um die bis dahin verwendeten Bindewerte kümmert (also kein "bind peeking" verwendet).
- Dieser generische Plan verwendet eine Selektivität, die sich ergibt, wenn man die - per default vorhandenen - Histogramme ignoriert.
- Ob der generische Plan verwendet wird, hängt auch noch davon ab, ob der Optimizer ihn als effizienter betrachtet als die "custom plans" (die im Beispiel bei den ersten fünf Ausführungen verwendet wurden). Ist das nicht der Fall, bleibt der Optimizer bei den "custom plans".
- in Postgres 12 lässt sich das Verhalten des Optimizers stärker beeinflussen. Hier wird der PLAN_CACHE_MODE eingeführt, der die Werte AUTO (= das beschriebene Verfahren), FORCE_CUSTOM_PLAN und FORCE_GENERIC_PLAN annehmen kann.
- Postgres unterstützt kein "plan sharing" über de Grenzen von Sessions hinaus: es gibt keinen Shared Pool.
Insgesamt ist das wieder mal ein sehr schönes Beispiel dafür, wie gut sich die Konzepte unterschiedlicher RDBMS erläutern lassen, wenn man sie miteinander vergleicht.
Keine Kommentare:
Kommentar veröffentlichen