Mittwoch, April 11, 2012

Extended Statistics und "out-of-range" cardinalities

Randolf Geist zeigt in seinem Artikel Column Groups - Edge Cases, dass die cardinality Schätzungen des cbo für column groups beim Einsatz von extended statistics (oder beim Vorliegen eines entsprechenden Index) völlig unbrauchbar werden, wenn nur ein einziger distinkter Wert für die Spaltenkombination vorliegt:
  • Für eine einzelne Spalte fällt die cardinality Schätzung in einem solchen Fall von "alle Sätze der Tabelle (für die das Attribut not null ist)" auf 1 (also eine aufgerundete 0) - es gibt also kein langsames Absinken der cardinality jenseits von high_value und low_value, wie es im Fall mehrerer distinkter Werte auftritt. Das Verhalten ist somit völlig plausibel.
  • Für eine Spaltenkombination, zu der extended statistics angelegt wurden (oder zu der Index-Statistiken vorliegen wie in Randolfs Test), bleibt die Cardinality-Schätzung in allen Fällen bei "alle Sätze der Tabelle" (wobei NULL values anscheinend noch mal besonders seltsame Effekte hervorrufen - vgl. dazu meinen Kommentar in Randolfs Blog). Und das ist natürlich völlig falsch, wenn nicht die tatsächlich existierende Werte-Kombination vorliegt.
Wahrscheinlich sind Spalten mit einer solchen Werteverteilung nicht unbedingt Kandidaten für extended statistics, aber ein Index für die Spaltenkombination könnte recht unerfreuliche Effekte hervorrufen.

Nachtrag 12.04.2012: auch Jonathan Lewis hat gerade einen Artikel zum Verhalten von extended statistics mit "out-of-range" Prädikaten veröffentlicht. Dort stellt er fest, dass ein Über- oder Unterschreiten der Grenzwerte dazu führt, dass wieder auf die Statistiken der Einzelspalten zugegriffen wird - zumindest dann, wenn mehrere unterschiedliche Werte für die Spalten vorliegen. Maria Colgan erklärt das Verhalten in einem Kommentar zum Artikel:
This behavior is expected and it was a deliberate design decision to prevent over-estimations when one of the values supplied is ‘out of range’. We can’t ignore the ‘out of range’ scenario just because we have a column group. Extended statistics do not contain the min, max values for the column group so we rely on the individual column statistics to check for ‘out of range’ scenarios like yours. When one of the columns is ‘out of range’, we revert back to the column statistics because we know it is going to generate a lower selectivity range and if one of the columns is ‘out of range’ then the number of rows returned will be lower or none at all, as in your example.
Für den von Randolf betrachteten Spezialfall scheint dieses Verhalten aber nicht zu gelten, denn das Verlassen des Werte-Ranges (mit einem Wert) führt ja keine Reduzierung der Cardinality auf den Wert 1 herbei, der ohne Index (oder extended statistics) erscheinen würde.. 

Keine Kommentare:

Kommentar veröffentlichen