Dienstag, April 03, 2012

auto_sample_size und Histogramme

Randolf Geist hatte vor ein paar Tagen in einem Kommentar hier darauf hingewiesen, dass Oracle bei Verwendung der auto_sample_size für die Erzeugung von Histogrammen nur ein recht kleines Sample von ca. 5500 Sätzen verwendet. Dazu passt der neuste Artikel von Maria Colgan im Blog der cbo Entwickler, in dem sie erklärt, dass die sample_size für Spalten mit Histogrammen irreführend ist:
The sample size shown for these columns is not the sample size used to gather the basic column statistics. AUTO_SAMPLE_SIZE still uses all the rows in the table - the NULL rows to gather the basic column statistics (55,500 rows in this case). The size shown is the sample size used to create the histogram on the column.
Außerdem bestätigt Frau Colgan, dass das sample für die Histogramme:
  • in der Regel ca. 5.500 NON-NULL Werte enthält
  • üblicherweise für den Aufbau aller Histogramme für die Tabelle verwendet wird
  • vergrößert wird, wenn ein Attribut sehr viele NULL values enthält (damit man immer noch auf die magischen 5.500 kommt); in diesem Fall kann es dann auch vorkommen, dass mehrere samples für Fälle mit extrem unterschiedlicher NULL-Häufigkeit erzeugt werden.
Besonders solide scheint das Verfahren tatsächlich nicht zu sein, denn 5.500 halte ich für arg wenig (und sehr willkürlich). Insofern finde ich Randolfs Vorschlag sehr plausibel, die Histogramm-Erzeugung in einen zweiten dbms_stats-Aufruf auszulagern (auch wenn das ein zusätzliches Lesen der Tabelle erforderlich macht).

Keine Kommentare:

Kommentar veröffentlichen