Aufgrund der Tatsache, daß ausgewählte Systemkatalogstatistiken aktualisierbar sind, haben Sie folgende Möglichkeiten:
Auf geschäftlich genutzten Systemen sollten die Statistiken nicht aktualisiert werden, da dies dazu führen kann, daß das Optimierungsprogramm nicht den besten Zugriffsplan für eine Abfrage findet.
Zur Aktualisierung der Werte dieser Statistikspalten wird die SQL-Anweisung UPDATE für die Sichten verwendet, die im Schema SYSSTAT definiert sind. Folgende Statistiken können aktualisiert werden:
Sie können diese Statistiken auch aktualisieren, wenn Ihre Benutzer-ID über eine explizite Berechtigung DBADM für die Datenbank verfügt. Das heißt, wenn Ihre Benutzer-ID in der Tabelle SYSCAT.DBAUTH mit der Berechtigung DBADM eingetragen ist. Durch die Zugehörigkeit zu einer DBADM-Gruppe wird diese Berechtigung nicht explizit erteilt.
Mit Hilfe dieser Sichten kann ein Datenbankadministrator (DBADM) alle Statistikzeilen für alle Benutzer anzeigen. Ein Benutzer ohne die Berechtigung DBADM kann nur die Zeilen anzeigen, die statistische Daten für Objekte enthalten, für die er die Berechtigung CONTROL hat.
Das folgende Beispiel zeigt, wie die Tabellenstatistik für die Tabelle EMPLOYEE aktualisiert werden kann:
UPDATE SYSSTAT.TABLES SET CARD = 10000, NPAGES = 1000, FPAGES = 1000, OVERFLOW = 2 WHERE TABSCHEMA = 'userid' AND TABNAME = 'EMPLOYEE'
Bei der Aktualisierung der Katalogstatistik ist Vorsicht geboten. Willkürliche Aktualisierungen können ernste Auswirkungen auf die Leistung nachfolgender Abfragen haben. Die folgenden Methoden stehen zur Verfügung, wenn Sie an diesen Tabellen vorgenommene Aktualisierungen ersetzen wollen:
In einigen Fällen kann es vorkommen, daß das Optimierungsprogramm einen bestimmten statistischen Wert oder eine Kombination von Werten als ungültig erkennt, so daß es die entsprechenden Standardwerte verwendet und eine Warnung ausgibt. Situationen dieser Art sind jedoch selten, da der Hauptteil der Gültigkeitsprüfungen bei der Aktualisierung der Statistiken durchgeführt wird.
Zusätzliche Informationen: Informationen zur Aktualisierung von Katalogstatistiken finden Sie in den folgenden Abschnitten:
Die wichtigste Regel, die bei einer Aktualisierung der Katalogstatistiken zu beachten ist, ist die Sicherstellung, daß gültige Werte, Wertebereiche und Formate der verschiedenen Statistiken in den Statistiksichten gespeichert werden. Darüber hinaus muß die Konsistenz der Beziehungen zwischen verschiedenen Statistiken gewahrt bleiben.
Zum Beispiel muß der Wert für COLCARD in der Sicht SYSSTAT.COLUMNS kleiner sein als der für CARD in der Sicht SYSSTAT.TABLES (die Anzahl der unterschiedlichen Werte in einer Spalte kann nicht größer sein als die Anzahl der Zeilen). Nehmen Sie an, Sie wollen den Wert für COLCARD von 100 auf 25 und den Wert für CARD von 200 auf 50 verringern. Wenn Sie die Sicht SYSCAT.TABLES zuerst aktualisieren, sollten Sie eine Fehlernachricht empfangen (da CARD kleiner als COLCARD würde). Die richtige Reihenfolge wäre, zuerst den Wert für COLCARD in der Sicht SYSCAT.COLUMNS und anschließend den Wert für CARD in der Sicht SYSSTAT.TABLES zu aktualisieren. Der Fall stellt sich umgekehrt dar, wenn Sie den Wert von COLCARD von 100 auf 250 und den Wert für CARD von 200 auf 300 erhöhen wollen. In diesem Fall müßten Sie zuerst den Wert CARD und anschließend den Wert COLCARD aktualisieren.
Wenn ein Konflikt zwischen einer aktualisierten Statistik und einer anderen Statistik festgestellt wird, wird eine Fehlernachricht ausgegeben. Jedoch werden vielleicht nicht immer Fehler gemeldet, wenn Konflikte auftreten. In einigen Fällen können die Konflikte nur schwer festgestellt und als Fehler gemeldet werden, besonders wenn die beiden zusammengehörigen Statistiken in verschiedenen Katalogen gespeichert sind. Aus diesem Grund sollten Sie solche Konflikte umsichtig vermeiden.
Die folgenden allgemeinen Prüfungen sollten vor der Aktualisierung einer Katalogstatistik durchgeführt werden:
Anmerkung: | Bei Spaltentypen sind die statistischen Daten auf Tabellenebene für NPAGES, FPAGES und OVERFLOW für eine untergeordnete Tabelle nicht aktualisierbar. |
Es gibt nur vier statistische Werte, die Sie in der Katalogsicht SYSSTAT.TABLES aktualisieren können: CARD, FPAGES, NPAGES und OVERFLOW. Beachten Sie dabei folgendes:
Wenn Sie in einem System mit zusammengeschlossenen Datenbanken arbeiten, gehen Sie bei der Erstellung bzw. Aktualisierung von Statistiken für einen Kurznamen über eine ferne Sicht sehr vorsichtig vor. Die statistischen Informationen, wie zum Beispiel die Anzahl von Zeilen, die von diesem Kurznamen zurückgegeben werden, entsprechen möglicherweise nicht dem realen Aufwand zur Auswertung dieser Sicht und können das DB2-Optimierungsprogramm irreführen. Fälle, die von Aktualisierungen der Statistiken profitieren können, sind ferne Sichten, die für eine einzelne ferne Tabelle ohne Anwendung von Spaltenfunktionen in der SELECT-Liste definiert wurden. Komplexe Sichten erfordern möglicherweise einen komplexen Optimierungsprozeß, der die Optimierung jeder einzelnen Abfrage erforderlich macht. Ziehen Sie statt dessen die Erstellung lokaler Sichten über Kurznamen in Betracht, damit das DB2-Optimierungsprogramm in der Lage ist, den Aufwand für die Sicht exakter abzuschätzen.
Bei der Aktualisierung von Statistikdaten in der Katalogsicht SYSSTAT.COLUMNS sind folgende Regeln zu beachten. Einzelheiten zur Aktualisierung von Statistikdaten zur Datenverteilung in den Spalten finden Sie in Regeln zur Aktualisierung von Verteilungsstatistiken für Spalten.
Der Abschnitt Benutzeraktualisierbare Katalogstatistiken enthält allgemeine Informationen zur Aktualisierung von Katalogstatistiken. Sie sollten mit den Informationen des genannten Abschnitts vertraut sein, bevor Sie versuchen, statistische Daten über die Werteverteilung in Spalten zu aktualisieren.
Damit sämtliche Statistiken im Katalog konsistent bleiben, muß bei der Aktualisierung der Verteilungsstatistiken mit großer Vorsicht gearbeitet werden. Im einzelnen müssen die Katalogeinträge für Häufigkeitsstatistiken und Quantildaten für jede Spalte die folgenden Bedingungen erfüllen:
Nehmen Sie an, es stehen Verteilungsstatistikdaten für eine Spalte C1 mit "Z" Zeilen zur Verfügung, und Sie möchten die Statistiken so modifizieren, daß sie einer Spalte mit identischen relativen Proportionen der Datenwerte, aber mit "(F x Z)" Zeilen entsprechen. Um die Größenordnung der Häufigkeitsstatistiken um einen Faktor F zu erhöhen, muß jeder Eintrag der Spalte VALCOUNT mit F multipliziert werden. Um die Quantilwerte ebenfalls um einen Faktor F zu vergrößern, muß jeder Eintrag der Spalte VALCOUNT mit F multipliziert werden. Werden diese Regeln nicht beachtet, kann das Optimierungsprogramm den falschen Filterfaktor verwenden, was bei der Ausführung der Abfrage zu nicht vorhersehbaren Auswirkungen auf die Leistung führen kann.
Bei der Aktualisierung der Statistiken in der Katalogsicht SYSSTAT.INDEXES sind folgende Regeln zu beachten:
Eine gültige Aktualisierung der Wertefolge für PAGE_FETCH_PAIRS ist zum Beispiel:
PAGE_FETCH_PAIRS = '100 380 120 360 140 340 160 330 180 320 200 310 220 305 240 300 260 300 280 300 300 300'
Dabei gilt folgendes:
NPAGES = 300 CARD = 10000 CLUSTERRATIO = -1 CLUSTERFACTOR = 0.9
FIRSTKEYCARD <= FIRST2KEYCARD <= FIRST3KEYCARD <= FIRST4KEYCARD <= FULLKEYCARD <= CARD
Über die Katalogsicht SYSSTAT.FUNCTIONS können Statistiken für benutzerdefinierte Funktionen (UDFs) aktualisiert werden. Wenn diese Statistik verfügbar ist, werden sie vom Optimierungsprogramm zur Abschätzung des Aufwands für verschiedene Zugriffspläne verwendet. Ist diese Statistik nicht verfügbar, enthalten die Spalten der Statistik den Wert -1, und das Optimierungsprogramm verwendet Standardwerte, die von einer einfachen benutzerdefinierten Funktion ausgehen.
Die folgende Tabelle enthält Informationen zu den Spalten mit statistischen Daten, die für benutzerdefinierte Funktionen aktualisiert werden können:
Tabelle 48. Funktionsstatistiken (SYSCAT.FUNCTIONS und SYSSTAT.FUNCTIONS)
Statistik | Beschreibung |
---|---|
IOS_PER_INVOC | Geschätzte Anzahl der Schreib-/Leseanforderungen, die jedesmal ausgeführt werden, wenn eine Funktion ausgeführt wird |
INSTS_PER_INVOC | Geschätzte Anzahl der Maschineninstruktionen, die jedesmal ausgeführt werden, wenn eine Funktion ausgeführt wird |
IOS_PER_ARGBYTE | Geschätzte Anzahl der Schreib-/Leseanforderungen, die für jedes Eingabeargumentbyte ausgeführt werden |
INSTS_PER_ARGBYTES | Geschätzte Anzahl der Maschineninstruktionen, die für jedes Eingabeargumentbyte ausgeführt werden |
PERCENT_ARGBYTES | Geschätzter Durchschnittsprozentwert der Eingabeargumentbyte, die von der Funktion tatsächlich verarbeitet werden |
INITIAL_IOS | Geschätzte Anzahl der Schreib-/Leseanforderungen, die nur beim ersten/letzten Aufruf der Funktion ausgeführt werden |
INITIAL_INSTS | Geschätzte Anzahl der Maschineninstruktionen, die nur beim ersten/letzten Aufruf der Funktion ausgeführt werden |
CARDINALITY | Geschätzte Anzahl von Zeilen, die von einer Tabellenfunktion generiert werden |
Betrachten Sie zum Beispiel eine benutzerdefinierte Funktion (EU_SHOE), die eine amerikanische Schuhgröße in die entsprechende europäische Schuhgröße umwandelt. (Diese beiden Schuhgrößen könnten benutzerdefinierte Datentypen (UDTs) haben.) Für diese UDF sollten Sie die Statistikspalten mit folgenden Werten versehen:
PERCENT_ARGBYTES würde für eine Funktion verwendet, die nicht immer die gesamte Eingabezeichenfolge verarbeitet. Ein Beispiel wäre eine benutzerdefinierte Funktion (LOCATE), an die zwei Argumente als Eingabe übergeben werden und die die Anfangsposition des ersten Vorkommens des ersten Arguments innerhalb des zweiten Arguments als Ergebnis zurückliefert. Nehmen Sie an, daß die Länge des ersten Arguments ausreichend klein ist, um im Vergleich zum zweiten Argument kaum eine Rolle zu spielen, und im Durchschnitt 75% des zweiten Arguments zum Auffinden des ersten durchsucht werden. Aufgrund dieser Informationen sollte der Wert für PERCENT_ARGBYTES auf 75 gesetzt werden. Die obige Abschätzung eines Durchschnitts von 75% fußt dabei auf folgenden zusätzlichen Annahmen:
Die Werte für INITIAL_INSTS bzw. INITIAL_IOS können zur Aufzeichnung der geschätzten Anzahl von Maschineninstruktionen bzw. Schreib-/Leseanforderungen verwendet werden, die nur beim ersten bzw. letzten Aufruf der Funktion ausgeführt werden. Diese Möglichkeit könnte zum Beispiel zur Aufzeichnung des Aufwands für die Einrichtung eines Arbeitspufferbereichs verwendet werden.
Informationen über Ein-/Ausgaben und Instruktionen, die von einer benutzerdefinierten Funktion verursacht werden, erhalten Sie über die Ausgaben des Compilers für die Programmiersprache bzw. der vom Betriebssystem bereitgestellten Überwachungsprogramme.
Manchmal ist es wünschenswert, auf einem Testsystem einen Teil der Daten eines tatsächlich geschäftlich genutzten Systems nachzubilden. Jedoch sind die Zugriffspläne, die auf einem solchen Testsystem ausgewählt werden, nicht unbedingt dieselben wie die, die auf dem tatsächlich genutzten System gewählt würden, sofern nicht die Katalogstatistiken und die Konfigurationsparameter auf dem Testsystem so aktualisiert werden, daß sie mit denen auf dem Produktionssystem übereinstimmen.
Es steht das Tool db2look zur Verfügung, das für die Produktionsdatenbank ausgeführt werden kann, um die Aktualisierungsanweisungen (UPDATE-Anweisungen) zu generieren, die erforderlich sind, um die Katalogstatistiken der Testdatenbank in Übereinstimmung mit denen der Produktionsdatenbank zu bringen. Diese Aktualisierungsanweisungen können mit Hilfe des Programms db2look mit der Option -m (mimic mode) generiert werden. In diesem Fall generiert das Tool db2look eine Prozedur für den Befehlsprozessor, die alle Anweisungen enthält, die erforderlich sind, um die Katalogstatistiken der Produktionsdatenbank nachzubilden. Dies kann bei der Analyse von SQL-Anweisungen mit Hilfe von Visual Explain in einer Testumgebung nützlich sein.
Sie können Datenbankdatenobjekte einschließlich Tabellen, Sichten, Indizes und andere Objekte in einer Datenbank wieder erstellen, indem Sie die DDL-Anweisungen mit dem Befehl db2look -e extrahieren. Sie können die Prozedur für den Befehlsprozessor, die mit diesem Befehl erstellt wurde, in einer anderen Datenbank ausführen, um die Datenbank neu zu erstellen. Sie können die Optionen -e und -m zusammen verwenden.
Nach der Ausführung der von db2look erstellten Aktualisierungsanweisungen im Testsystem kann das Testsystem zur Prüfung der Zugriffspläne verwendet werden, die in der Produktionsdatenbank generiert werden sollen. Da das Optimierungsprogramm die Art und Konfiguration der Tabellenbereiche zur Abschätzung der E/A-Aufwände verwendet, muß das Testsystem über dieselbe Tabellenbereichsanordnung bzw. -konfiguration verfügen. Das heißt, sie muß dieselbe Anzahl von Behältern desselben Typs, SMS oder DMS, haben.
Das Tool db2look befindet sich im Unterverzeichnis bin.
Weitere Informationen zur Verwendung dieses Tools erhalten Sie, wenn Sie folgendes in eine Befehlszeile eingeben:
db2look -h
Weitere Informationen zu diesem Programm finden Sie außerdem im Handbuch Command Reference.
Darüber hinaus bietet die Steuerzentrale eine Schnittstelle zum Programm db2look namens "DDL generieren für Objektname". Die Steuerzentrale ermöglicht eine Integration der Ergebnisdatei aus dem Dienstprogramm in die Prozedurzentrale. Sie können außerdem den Befehl db2look über die Steuerzentrale zeitlich terminieren. Ein Unterschied bei der Verwendung der Steuerzentrale besteht darin, daß eine Analyse nur einer Tabelle durchgeführt werden kann, während in einem Aufruf des Befehls db2look bis zu 30 Tabellen analysiert werden können. Beachten Sie darüber hinaus, daß LaTex- und Graphical-Ausgaben über die Steuerzentrale nicht unterstützt werden.
Sie können auch das Dienstprogramm db2look für eine OS/390-Datenbank ausführen. Das Dienstprogramm db2look extrahiert die Statistikdatenanweisungen DDL und UPDATE für OS/390-Objekte. Diese Funktion ist sehr nützlich, wenn Sie OS/390-Objekte extrahieren und in einer DB2 UDB-Datenbank (UDB - Universal Database) erneut erstellen möchten. Zusätzliche Informationen zum Dienstprogramm db2look finden Sie im Handbuch Command Reference.
Zwischen den Statistikdaten von DB2 UDB und denen von OS/390 gibt es einige Unterschiede. Das Dienstprogramm db2look führt die entsprechenden Umsetzungen von DB2 für OS/390 auf DB2 UDB aus, wenn dies zutreffend ist, und setzt die Statistikdaten von DB2 UDB, für die in DB2 für OS/390 keine Entsprechung vorhanden ist, auf einen Standardwert (-1). Im folgenden wird beschrieben, wie das Dienstprogramm db2look die Statistikdaten von DB2 für OS/390 den Statistikdaten von DB2 UDB zuordnet. In den nachfolgenden Erläuterungen steht jeweils "UDB_x" für eine Statistikdatenspalte von DB2 UDB; "S390_x" steht für eine Statistikdatenspalte von DB2 für OS/390.
Es gibt keinen Parameter S390_FPAGES. DB2 für OS/390 verfügt jedoch über einen anderen Parameter für Statistikdaten mit dem Namen PCTPAGES, der den Prozentsatz von aktiven Tabellenbereichsseiten darstellt, die Zeilen der Tabelle enthalten. Daher kann der Wert des Parameters UDB_FPAGES auf der Basis von S390_NPAGES und S390_PCTPAGES wie folgt berechnet werden:
UDB_FPAGES=(S390_NPAGES * 100)/S390_PCTPAGES
Es gibt keinen Parameter S390_OVERFLOW, der UDB_OVERFLOW zugeordnet werden kann. Daher wird dieser Wert vom Dienstprogramm db2look einfach auf den Standardwert festgelegt:
UDB_OVERFLOW=-1
Es gibt keinen Parameter S390_AVGCOLLEN, der UDB_AVGCOLLEN zugeordnet werden kann. Daher wird dieser Wert vom Dienstprogramm db2look einfach auf den Standardwert festgelegt:
UDB_AVGCOLLEN=-1
Die anderen Statistikdaten, für die es keine OS/390-Entsprechungen gibt, werden einfach auf den Standardwert festgelegt. Dieser ist wie folgt definiert:
UDB_FIRST2KEYCARD = -1 UDB_FIRST3KEYCARD = -1 UDB_FIRST4KEYCARD = -1 UDB_CLUSTERFACTOR = -1 UDB_SEQUENTIAL_PAGES = -1 UDB_DENSITY = -1
In DB2 für OS/390-SYSIBM.SYSCOLUMNS gibt es zwei Arten von Statistikdaten: Die Art "F" für häufige (Frequent) Werte und die Art "C" für Kardinalität (Cardinality). Nur Einträge der Art "F" gelten für DB2 für UDB. Dies sind auch die Einträge, die in Betracht gezogen werden. Darüber hinaus gibt es in DB2 für OS/390-SYSIBM.SYSCOLUMNS keine Spalte SEQNO. Diese ist aber für DB2 für UDB erforderlich. Daher generiert das Dienstprogramm db2look eine solche Spalte automatisch.
UDB_COLVALUE = S390_COLVALUE UDB_VALCOUNT = S390_FrequencyF * S390_CARD