Im OTN Forum wurde heute die Frage gestellt, warum die join cardinality für eine Query mit einem Join zweier Tabellen über Spalten ohne übereinstimmende Werte bei Verwendung von dynamic sampling in 11g komplett falsch berurteilt wurde: statt einer Selektivität von 0 erwartet der Optimizer im Beispiel eine Selektivität von 10%. Ein CBO Trace zur Query erklärt das Verhalten: dynamic sampling liefert zwar akkurate cardinalities, führt aber keine Bestimmung der Wertebereiche der Join-Spalten durch und muss deshalb auf die Standardformel zur Berechnung von join selectivities zurückgreifen. Bei Verwendung persistierter Statistiken kann der Optimizer hingegen die über die HIGH_VALUE und LOW_VALUE-Angaben in user_tab_cols angezeigten Wertebereiche berücksichtigen und feststellen, dass der Join keine Ergebnisse liefern dürfte. Da Jonathan Lewis meine Erklärung mit dem Kommentar "Nice explanation" versehen hat, gehe ich davon aus, dass sie zutreffend ist.
Nachtrag 16.12.2013: die sich im Thread anschließende Diskussion und genauere Analyse des Verhaltens liefert noch eine ganze Reihe interessanter Erkenntnisse:
Nachtrag 16.12.2013: die sich im Thread anschließende Diskussion und genauere Analyse des Verhaltens liefert noch eine ganze Reihe interessanter Erkenntnisse:
- bei Verwendung des neuen Auto-Werts (11) für das dynamic sampling gibt es in 12.1 recht merkwürdige Schätzungen, die auf den ersten Blick inkohärent wirken. Ursache ist die Verknüpfung von default-werten für die Basis-Tabellenstatistiken mit einem sampling der join cardinality (wobei im gegebenen Fall eigentlich kein sampling erfolgt, sondern der user query eine nahezu identische count-Operation vorausgeschickt wird). Dabei wird der korrekte Angabe allerdings nicht in allen Fällen zur Überschreibung eingesetzt.
- das CBO-Trace (Event 10053) verschweigt sampling Operationen zur Bestimmung von join cardinalities. Allerdings erscheint im Trace die Angabe "Adjusted Join Cards", die die Überschreibung der berechneten Cardinality durch den ermittelten Wert anzeigt (allerdings ohne Angabe von Gründen). Randolf Geist verweist in diesem Zusammenhang auf das (halbwegs) neue Trace Framework in 11g (das ich mir gelegentlich genauer anschauen sollte).
Ich spare mir an dieser Stelle eine detailliertere Wiedergabe der Analyseschritte und verweise auf den Thread - obwohl der Fall eine meiner besseren detektivischen Leistungen der letzten Monaten gewesen sein dürfte.
Keine Kommentare:
Kommentar veröffentlichen