Mit dem Dienstprogramm RUNSTATS werden die Systemkatalogtabellen aktualisiert, um den Prozeß zur Optimierung der Abfragen zu unterstützen. Ohne diese Statistiken könnte der Datenbankmanager für die Leistung von SQL-Anweisungen nachteilige Entscheidungen treffen. Das Dienstprogramm RUNSTATS ermöglicht es, statistische Daten über die in den Tabellen und/oder Indizes enthaltenen Daten zu erfassen.
Das Dienstprogramm RUNSTATS dient zur Erfassung statistischer Daten sowohl über die Tabellendaten als auch über die Indexdaten, um genaue Informationen für den Auswahlprozeß des Zugriffsplans in folgenden Situationen bereitzustellen:
In einer partitionierten Datenbank erfassen Sie die zu einer Tabelle und den entsprechenden Indizes gehörenden Statistikdaten, indem Sie das Dienstprogramm RUNSTATS auf einem einzigen Knoten ausführen. (Der Knoten, auf dem das Dienstprogramm ausgeführt wird, wird dadurch bestimmt, ob der Knoten, auf dem Sie den Befehl eingeben, Tabellendaten enthält oder nicht. Einzelheiten hierzu finden Sie in Die Datenbankpartition, auf der RUNSTATS ausgeführt wird.) Da die in den Katalogen gespeicherten Statistikdaten Informationen auf Tabellenebene darstellen sollen, werden die auf Knotenebene vom Datenbankmanager gesammelten Statistikdaten gegebenenfalls mit der Anzahl der Knoten multipliziert, auf die die Tabelle partitioniert ist. Dieses Verfahren liefert einen Näherungswert für die tatsächlichen Statistikdaten, die erfaßt würden, wenn RUNSTATS auf jedem Knoten ausgeführt und die Daten zu einem Gesamtergebnis aufsummiert würden.
Anmerkung: | Das DB2-Abfrageoptimierungsprogramm nimmt an, daß die Attributwerte (Daten) gleichmäßig über die Datenbankpartitionen des Systems verteilt sind. Wenn die Verteilung nicht gleichmäßig ist, sollten Sie diesen Befehl in einer Datenbankpartition ausführen, die sich nach Ihrer Meinung durch eine repräsentative Tabellenverteilung auszeichnet. |
Wenn Sie das Dienstprogramm RUNSTATS für eine Tabelle aufrufen, müssen Sie mit der Datenbank verbunden sein, in der die Tabelle gespeichert ist, jedoch muß die Datenbankpartition, von der aus Sie diesen Befehl ausführen, nicht unbedingt eine Partition für diese Tabelle enthalten:
Die Analyse der Statistiken kann aufzeigen, wann eine Reorganisation der Daten erforderlich ist. Einige Anhaltspunkte dafür sind:
Bei der Erfassung der Statistik über das Clusterverhältnis (CLUSTERRATIO) wird der entsprechende Wert im Bereich von 0 bis 100 angegeben. Bei der Statistik über den Clusterfaktor (CLUSTERFACTOR) ist dieser Wert eine Zahl aus dem Bereich zwischen 0 und 1. Nur einer dieser Werte zur Erfassung der Clusterbildung wird im Katalog SYSCAT.INDEXES aufgezeichnet. Im allgemeinen kann nur einer der Indizes in einer Tabelle einen hohen Grad der Clusterbildung haben. Durch den Wert -1 wird angegeben, daß keine Statistik verfügbar ist.
Wenn Sie Verhältniswerte miteinander vergleichen möchten, multiplizieren Sie den Clusterfaktor mit 100, um einen Prozentwert für den Grad der Clusterbildung zu erhalten.
Indexsuchen, die nicht im reinen Indexzugriff durchgeführt werden, erzielen bei höheren Clusterverhältnissen wahrscheinlich eine bessere Leistung. Ein niedriges Clusterverhältnis führt zu vermehrten Ein-/Ausgabeoperationen für diese Art von Suche, da nach dem ersten Zugriff auf eine Datenseite die Wahrscheinlichkeit geringer ist, daß sich diese Seite immer noch im Pufferpool befindet, wenn der nächste Zugriff auf sie erfolgt. Die Leistung für einen Index ohne Clusterbildung kann durch Erhöhen der Puffergröße verbessert werden. (Lesen Sie im Abschnitt Vorablesezugriff über Listen die Informationen, wie der Datenbankmanager die Leistung bei der Indexsuche für Indizes mit niedrigen Clusterverhältnissen verbessern kann, und unter Geclusterte Indizes die Informationen zur Verwendung der Indexstatistik durch das Optimierungsprogramm.)
Wenn die Tabellendaten anfangs bezüglich eines bestimmten Index Clusterbildung aufwiesen und die Clusterinformationen nun anzeigen, daß in bezug auf denselben Index nur eine geringe Clusterbildung vorhanden ist, kann es sinnvoll sein, die Tabelle neu zu organisieren, um die Daten bezüglich dieses Index wieder in Clustern anzuordnen.
Die Überlaufzahl gibt die Anzahl der Zeilen an, die nicht auf ihre ursprünglichen Seiten passen. Dies kann geschehen, wenn Spalten des Typs VARCHAR mit längeren Werten aktualisiert werden. In diesen Fällen wird an der ursprünglichen Stelle der Zeile ein Zeiger gespeichert. Dadurch kann allerdings die Leistung beeinträchtigt werden, da der Datenbankmanager jetzt dem Zeiger folgen muß, um den Inhalt der Zeile zu finden. Dies verursacht eine Verlängerung der Verarbeitungszeit und kann außerdem zu vermehrten Ein-/Ausgabeoperationen führen.
Mit dem Ansteigen der Anzahl der Überlaufzeilen erhöht sich auch der potentielle Nutzen einer Reorganisation der Tabellendaten. Durch eine Reorganisieren der Tabellendaten wird der Überlauf von Zeilen beseitigt.
Die Anzahl der Seiten, die Zeilen enthalten, kann mit der Gesamtanzahl der Seiten, die eine Tabelle enthält, verglichen werden. Leere Seiten werden bei einer Tabellensuche gelesen. Leere Seiten können entstehen, wenn ganze Bereiche von Zeilen gelöscht werden.
Mit dem Ansteigen der Anzahl leerer Seiten wächst auch die Notwendigkeit einer Reorganisation einer Tabelle. Bei der Reorganisation einer Tabelle kann der Speicherbereich, der von der Tabelle eingenommen wird, komprimiert werden, indem diese leeren Seiten wieder freigegeben werden. Neben einer effizienteren Nutzung des Speicherbereichs kann die Wiedernutzbarmachung nicht verwendeter Seiten auch die Leistung bei einer Tabellensuche erhöhen, da weniger Seiten in den Pufferpool gelesen werden.
Anhand der Anzahl von Blattseiten kann vorausberechnet werden, wie viele Ein-/Ausgabeoperationen für Indexseiten beim Durchsuchen des gesamten Index erforderlich werden.
Wahlfreie Aktualisierungen können dazu führen, daß Seiten geteilt werden und dadurch die Größe des Index über den erforderlichen Minimalspeicherbereich hinaus anwächst. Wenn Indizes während der Reorganisation einer Tabelle neu erstellt werden, ist es möglich, jeden Index mit dem minimal erforderlichen Speicherbereich zu erstellen. Weitere Informationen zu den minimalen Speicheranforderungen für einen Index finden Sie in den Abschnitten Auswirkung des Indexierens auf die Abfrageoptimierung und unter " Erstellen eines Index oder einer Indexspezifikation" im Handbuch Systemverwaltung: Konzept.
Anmerkung: | Bei der Neuerstellung von Indizes werden standardmäßig zehn Prozent freien Speicherbereichs jeder Indexseite nicht belegt. Sie können den Betrag des freien Speicherbereichs mit Hilfe des Parameters PCTFREE bei der Ersterstellung des Index erhöhen. Anschließend wird bei jeder Reorganisation des Index der Wert für PCTFREE verwendet. Ein freier Speicherbereich, der größer als zehn Prozent ist, kann wichtig sein, wenn Sie die Häufigkeit verringern wollen, mit der der Index reorganisiert werden muß. Der freie Speicherbereich dient zur Unterbringung neuer Indexeinfügungen. |
Mit dem Dienstprogramm RUNSTATS können Sie auch feststellen, wie sich Änderungen in der Datenbank auf die Leistung auswirken. Die statistischen Daten zeigen die Datenverteilung innerhalb einer Tabelle. Wenn das Dienstprogramm RUNSTATS routinemäßig ausgeführt wird, können Daten zu Tabellen und Indizes über einen Zeitraum hinweg erhoben werden, anhand derer sich im Lauf der Entwicklung des Datenmodells Leistungstrends ablesen lassen.
Im Idealfall sollten Anwendungsprogramme nach der Ausführung von RUNSTATS erneut gebunden werden, damit das Abfrageoptimierungsprogramm einen anderen Zugriffsplan aufgrund der neuen Statistik auswählen kann.
Wenn Sie nicht über genügend Zeit verfügen, alle Statistiken auf einmal zu sammeln, können Sie RUNSTATS auch in regelmäßigen Abständen ausführen und jeweils nur einen Teil der Statistikdaten aktualisieren, die erfaßt werden könnten. Wenn aufgrund der Aktivitäten an den Tabellen zwischen den Zeitpunkten, zu denen Sie RUNSTATS zu einer Teilaktualisierung ausführen, Inkonsistenzen festgestellt werden, wird eine Warnung (SQL0437W, Ursachencode 6) ausgegeben. Sie verwenden zum Beispiel RUNSTATS zunächst, um Statistikdaten zur Tabellenverteilung zu sammeln. Später führen Sie RUNSTATS aus, um Indexstatistikdaten zu erfassen. Wenn Inkonsistenzen wegen der Aktivitäten an der Tabelle festgestellt werden, werden die Statistikdaten zur Tabellenverteilung gelöscht und die Warnung ausgegeben. Wenn dies geschieht, ist es ratsam, RUNSTATS zur Erfassung von Statistikdaten zur Tabellenverteilung ausführen.
RUNSTATS sollte von Zeit zu Zeit zur gleichzeitigen Erfassung von Tabellenstatistikdaten und Indexstatistikdaten ausgeführt werden, um sicherzustellen, daß die Indexstatistikdaten mit den Tabellenstatistikdaten synchronisiert sind. Indexstatistikdaten behalten die Mehrheit der bei der letzten Ausführung von RUNSTATS gesammelten Tabellen- und Spaltenstatistikdaten bei. Wenn seit der letzten Erfassung von Tabellenstatistikdaten umfangreiche Änderungen an der Tabelle vorgenommen wurden, geht durch die Erfassung nur der Indexstatistikdaten für diese Tabelle die Synchronisierung der beiden Arten von Statistikdaten verloren.
In folgenden Situationen kann es sinnvoll sein, statistische Daten nur für Indexdaten zu sammeln:
Mit dem Dienstprogramm RUNSTATS können unterschiedliche Ebenen statistischer Daten gesammelt werden. Für Tabellen können statistische Basisdaten oder auch Verteilungsdaten über die Spaltenwerte innerhalb einer Tabelle gesammelt werden (siehe Erfassen und Verwenden von Verteilungsstatistiken). Für Indizes können statistische Basisdaten oder auch Detaildaten gesammelt werden, die das Optimierungsprogramm bei der Ermittlung des Ein-/Ausgabeaufwands für eine Indexsuche unterstützen. (Informationen über diese "Detailstatistik" finden Sie in Geclusterte Indizes).
Anmerkung: | Für Spalten mit den Datentypen LONG oder LOB (großes Objekt) bzw. strukturierte Spalten werden keine statistischen Daten gesammelt. Bei Zeilentypen werden die statistischen Daten auf Tabellenebene für NPAGES, FPAGES und OVERFLOW für eine untergeordnete Tabelle nicht erhoben. Für erweiterte Indizes oder deklarierte temporäre Tabellen werden keine statistischen Daten gesammelt. |
Die folgenden Tabellen zeigen die Katalogstatistiken, die vom Dienstprogramm RUNSTATS aktualisiert werden:
Tabelle 44. Tabellenstatistiken (SYSCAT.TABLES und SYSSTAT.TABLES)
Statistik | Beschreibung | RUNSTATS-Option | |||
---|---|---|---|---|---|
Tabelle | Indizes | ||||
FPAGES | Anzahl der von einer Tabelle verwendeten Seiten | Ja | Ja | ||
NPAGES | Anzahl der Zeilen enthaltenden Seiten | Ja | Ja | ||
OVERFLOW | Anzahl der Überlaufzeilen | Ja | Nein | ||
CARD | Anzahl der Zeilen in der Tabelle (Kardinalität) | Ja | Ja (Anm. 2) | ||
|
Tabelle 45. Spaltenstatistiken (SYSCAT.COLUMNS und SYSSTAT.COLUMNS)
Statistik | Beschreibung | RUNSTATS-Option | |||
---|---|---|---|---|---|
Tabelle | Indizes | ||||
COLCARD | Anzahl der unterschiedlichen Werte der Spalte (Spaltenkardinalität) | Ja (Anm. 1) | Ja (Anm. 2) | ||
AVGCOLLEN | Durchschnittslänge der Spalte | Ja | Ja (Anm. 2) | ||
HIGH2KEY | Zweithöchster Wert der Spalte | Ja | Ja (Anm. 2) | ||
LOW2KEY | Zweitniedrigster Wert der Spalte | Ja | Ja (Anm. 2) | ||
NUMNULLS | Die Anzahl NULLs in einer Spalte | Ja | Ja (Anm. 2) | ||
|
Tabelle 46. Indexstatistiken (SYSCAT.INDEXES und SYSSTAT.INDEXES)
Statistik | Beschreibung | RUNSTATS-Option | |||
---|---|---|---|---|---|
Tabelle | Indizes | ||||
NLEAF | Anzahl der Indexblattseiten (leaf pages) | Nein | Ja (Anm. 3) | ||
NLEVELS | Anzahl der Indexstufen | Nein | Ja | ||
CLUSTERRATIO | Grad der Clusterbildung der Tabellendaten | Nein | Ja (Anm. 2) | ||
CLUSTERFACTOR | Feinerer Grad der Clusterbildung | Nein | Detailliert (Anm. 1,2) | ||
DENSITY | Verhältnis (Prozentsatz) von SEQUENTIAL_PAGES zur Anzahl der Seiten im Bereich der vom Index belegten Seiten (Anm. 4) | Nein | Ja | ||
FIRSTKEYCARD | Anzahl der unterschiedlichen Werte in der ersten Spalte des Index | Nein | Ja (Anm. 3) | ||
FIRST2KEYCARD | Anzahl der unterschiedlichen Werte in den ersten beiden Spalten des Index | Nein | Ja (Anm. 3) | ||
FIRST3KEYCARD | Anzahl der unterschiedlichen Werte in den ersten drei Spalten des Index | Nein | Ja (Anm. 3) | ||
FIRST4KEYCARD | Anzahl der unterschiedlichen Werte in den ersten vier Spalten des Index | Nein | Ja (Anm. 3) | ||
FULLKEYCARD | Anzahl der unterschiedlichen Werte in allen Spalten des Index | Nein | Ja (Anm. 3) | ||
PAGE_FETCH_PAIRS | Geschätzte Anzahl der Seitenabrufe für verschiedene Puffergrößen | Nein | Detailliert (Anm. 1,2) | ||
SEQUENTIAL_PAGES | Anzahl der Blattseiten (äußersten Seiten), die auf der Platte in der durch den Indexschlüssel definierten Reihenfolge mit wenigen oder keinen großen zwischenliegenden Lücken gespeichert sind | Nein | Ja | ||
|
Tabelle 47. Spaltenverteilungsstatistiken (SYSCAT.COLDIST und SYSSTAT.COLDIST)
Statistik | Beschreibung | RUNSTATS-Option | |||
---|---|---|---|---|---|
Tabelle | Indizes | ||||
DISTCOUNT | Wenn TYPE den Wert Q hat, die Anzahl unterschiedlicher Werte, die kleiner oder gleich dem Statistikwert COLVALUE sind. | Verteilung (Anm. 2) | Nein | ||
TYPE | Gibt an, ob die Zeile statistische Daten über die Häufigkeit der Werte oder über Quantilwerte enthält | Verteilung | Nein | ||
SEQNO | Die Stelle in der Häufigkeitsrangfolge einer Folgenummer, die als Hilfe zur eindeutigen Bestimmung der Zeile in der Tabelle verwendet werden kann | Verteilung | Nein | ||
COLVALUE | Datenwert, für den Statistikdaten zur Häufigkeit oder zu Quantilwerten gesammelt werden | Verteilung | Nein | ||
VALCOUNT | Häufigkeit, mit der der Datenwert in der Spalte auftritt, oder bei Quantilwerten die Anzahl der Werte, die kleiner oder gleich dem Datenwert (COLVALUE) sind | Verteilung | Nein | ||
|
Weitere Informationen über Verteilungsstatistiken zu Spalten lesen Sie im Abschnitt Erfassen und Verwenden von Verteilungsstatistiken.
Statistische Daten für benutzerdefinierte Funktionen werden vom Dienstprogramm RUNSTATS nicht erfaßt. Für diese Funktionen müssen die Statistiken manuell aktualisiert werden. Lesen Sie dazu die Abschnitte Benutzeraktualisierbare Katalogstatistiken und Aktualisieren der Statistiken für benutzerdefinierte Funktionen.