Sonntag, Mai 27, 2012

Kosten für Nested Loops Join

Randolf Geist weist in seinem Blog darauf hin, dass die Standardformel für die Kostenberechnung von Nested Loop Joins unter bestimmten Bedingungen durch eine Sonderfallregel überschrieben wird. Die Standardformel lautet dabei:
Cost (outer rowsource) + Cost (inner rowsource) * Card (outer rowsource)
In Fällen, in denen der CBO annimmt, dass die Anzahl der Matches in den Schleifendurchläufen deutlich niedriger ist als die Anzahl der Schleifendurchläufe (was Oracle als "sparse" join bezeichnet und aus dem Verhältnis der NUM_DISTINCT-Werte der Join-Spalte(n) ableitet), greift allerdings eine andere Regel, die die Kosten massiv reduziert, was in Extremfällen dann natürlich wieder extrem falsch sein kann - dann nämlich, wenn die Reduktion der Matches viel geringer ausfällt als aufgrund des Verhältnisses der NUM_DISTINCT-Angaben zu erwarten wäre.

Randolf weist auch noch darauf hin, dass diese Spezialfallregel als Bugfix in 10.1.0.3 eingeführt wurde und über fix control deaktiviert werden kann.

Keine Kommentare:

Kommentar veröffentlichen