|
Neues zum Statistikmanagement mit DBMS_STATS
von Ulrike Schwinn, ORACLE Deutschland GmbH
Optimizer-Statistiken liefern seit der Einführung des Cost Based Optimizers eine der wichtigsten
Grundlagen zur Ermittlung eines guten Ausführungsplans durch den Optimizer. Um das Statistikmanagement
zu erleichtern, gibt es seit Oracle Version 10g einen vordefinierten Datenbank-Scheduler Job, der in einem
vordefinierten Mainentance Window ausgeführt wird, und das Sammeln von Statistiken automatisiert.
Automatisch wird dabei die Sample-Grösse festgelegt, die "STALE"-Statistiken berechnet und
die Histogramm-Erzeugung festgelegt.
Die manuelle Nutzung des Package DBMS_STATS ist dadurch allerdings nicht überflüssig
geworden, da DBMS_STATS über den vordefinierten Scheduler-Job hinaus eine Vielzahl von
zusätzlichen Möglichkeiten bietet, die zudem in 11g erweitert worden sind.
Abgesehen vom manuellen Sammeln von Statistiken kann die Nutzung des Package DBMS_STATS weitere
interessante Aufgaben erfüllen wie z.B.:
Statistiken importieren und exportieren
Statistiken durch andere Statistiken ersetzen, um unterschiedliche Workloads zu simulieren
Statistiken löschen
Statistiken sperren
Statistiken als privat deklarieren (11g)
Statistikberechnung auf Gruppen oder Ausdrücke von Spalten erweitern (11g)
Unterschiede der Statistiken von verschiedenen Zeitpunkten monitoren
Auf Statistiken eines älteren Zeitpunkts zurücksetzen
(11g): Die erst ab 11g zur Verfügung stehenden Funktionen sind gekennzeichnet.
In folgendem Tipp wird die Verwendung einiger dieser Funktionen an Beispielen demonstriert.
Seit Oracle Release 10g werden die Statistiken automatisch im SYSAUX Tablespace gespeichert,
falls sie mit dem Package DBMS_STATS verändert worden sind. Damit soll die Möglichkeit gegeben werden, bis zu
einem bestimmten Zeitpunkt Statistiken zurückzusetzen. Die Speicherdauer kann dabei konfiguriert und angezeigt werden.
Folgendes Beispiel zeigt die Verwendung:
Um zu beurteilen, wann Statistiken auf Schema- oder Datenbank-Ebene gesammelt worden sind,
kann die View DBA_OPTSTAT_OPERATIONS verwendet werden.
Abgesehen vom automatischen Datenbank Job-Lauf (siehe gather_database_stats(auto)), sind offensichtlich Schema-Statistiken von COMP und SCOTT
berechnet worden, wie in unserem Beispiel zu sehen ist.
Eine genaue Historie der Tabellen-Statistiken lässt sich über die View DBA_TAB_STAT_HISTORY einsehen.
In folgendem Beispiel der Tabelle BIGEMP zeigt sich, dass die Statistiken der Tabelle in kurzem Zeitraum hintereinander
gesammelt wurden.
Welches sind nun die Unterschiede in den Statistikberechnungen? Einfach Überprüfen lassen sich
die Tabellenstatistiken mit einem Differenzreport, der über die Funktion DIFF_TAB_STATS_IN_HISTORY generiert wird.
Als Eingabeparameter müssen zwei Zeitpunkte eingegeben werden. Der letzte Parameter gibt in Prozent an, wie
gross die Veränderung mindestens sein muss, um angeziegt zu werden - hier mindestens 1 Prozent.
Im Beispiel werden die Statistiken von 9:51 Uhr mit dem aktuellen Stand verglichen.
Es ist leicht zu erkennen, dass sich die Zeilengrösse zwischen dem Zeitpunkt A und B verändert hat. Zusätzlich
ist die Spalte FLAG hinzugefügt worden. Mit einem einzigen Kommando lässt sich nun der Zeitpunkt A
wiederherstellen.
Die Überprüfung mit der Funktion DIFF_TABLE_STATS_IN_HISTORY zeigt keine Veränderungen mehr an;
das Ersetzen der Statistiken war also erfolgreich.
Danach ist es natürlich immer noch möglich die Statistiken wieder auf den aktuellen Zeitraum B zu ändern.
Solche Massnahmen sollten natürlich zuerst in einer entsprechenden Testumgebung ausgetestet werden. Steht keine Testumgebung zur Verfügung, gibt es ab 11g die neue Möglichkeit die Statistiken als pending zu deklarieren
und in einer lokalen Session oder natürlich auch in einer Testumgebung zu testen.
Im folgenden Beispiel wird dies demonstriert.
Es wird eine Testtabelle EMP14, eine Kopie der EMP Tabelle mit 14 Zeilen, zur Verfügung gestellt und danach die
aktuellen Statistiken gesammelt.
Nun werden alle Zeilen gelöscht und erneut die Statistiken berechnet. Die Berechnung der Statistiken wird
allerdings erst dann durchgeführt, nachdem wir den Status PUBLISH auf FALSE gesetzt haben. Diese Art der
Statistiken werden im Folgenden als pending oder privat bezeichnet.
Eine Überprüfung der Statistiken zeigt, dass die "alten" Statistiken mit 14 Zeilen verwendet werden.
Pending Statistiken lassen sich nun in den entsprechenden Data Dictionary Views wie DBA_TAB_PENDING_STATS oder
DBA_IND_PENDING_STATS anzeigen. Wie publizierte Statistiken gibt es die Möglichkeiten mit den Prozeduren
EXPORT_PENDING_STATS einen Export durchzuführen und auf einem Testsystem einen Vergleich durchzuführen.
Allerdings steht keine Funktion IMPORT_PENDING_STATS (Stand Oktober 2010) zur Verfügung.
Möchte man hingegen einen Differenzreport generieren, lässt sich wie im vorangegangen
Beispiel eine spezielle Funktion des Package DBMS_STATS nutzen.
Der folgende Auszug illustriert dies am Beispiel:
Interessant ist die Möglichkeit in der lokalen Session den Parameter OPTIMIZER_USE_PENDING_STATISTICS zu verwenden. Ist dieser
Parameter auf TRUE eingestellt, werden die pending Statistiken bei der Ermittlung des Ausführungsplans berücksichtigt.
In Verbindung mit dem SQL Performance Analyzer ist damit ein einfaches Austesten von Änderungen an Statistiken
ohne Risiko möglich.
Mehr zu diesem Thema bzw. zu weiteren Themen rund um die Datenbank lesen Sie in den nächsten Ausgaben ...
Zurück zur Community-Seite
|