Montag, Juli 29, 2019

Prepared Statements und Bindewerte in Postgres

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.

Freitag, Juli 19, 2019

Informationen zur Hint-Verwendung in 19c

Eine schöne Ergänzung für dbms_xplan in 19c ist die Ergänzung des Formats HINT_REPORT - im verknüpften Artikel beschrieben von Gavin Soorma. Das Format liefert Informationen zu den im Statement angegebenen Hints und erklärt, warum ein Hint nicht berücksichtigt wurde. Diese Information musste man bislang über ein CBO Trace (Event 10053) ermitteln.