Die UPDATE STATISTICS-Anweisung (update_statistics_statement) bestimmt den Platzbedarf von Tabellen und Indizes und die Werteverteilung von Spalten und legt die Informationen im Datenbankkatalog ab.
<update_statistics_statement> ::=
UPDATE STAT[ISTICS] COLUMN <table_name>.<column_name> [ESTIMATE [<sample_definition>]]
| UPDATE STAT[ISTICS] COLUMN (<column_name>,...) FOR <table_name> [ESTIMATE [<sample_definition>]]
| UPDATE STAT[ISTICS] COLUMN (*) FOR <table_name> [ESTIMATE [<sample_definition>]]
| UPDATE STAT[ISTICS] <table_name> [ESTIMATE
[<sample_definition>]]
| UPDATE STAT[ISTICS] [<schema_name>.][<identifier>]* [ESTIMATE [<sample_definition>]]
| UPDATE STAT[ISTICS] AS PER SYSTEM
TABLE
Die Ausführung der UPDATE STATISTICS-Anweisung bewirkt, dass Informationen über die Tabelle wie die Anzahl der Zeilen, Anzahl belegter Seiten, Größe von Indizes, Werteverteilung innerhalb von Spalten oder Indizes usw. im Datenbankkatalog abgelegt werden. Diese Werte werden vom SQL-Optimierer zur Bestimmung der besten Suchstrategie zur Ausführung von komplexen SQL-Anweisungen benutzt.
Bei der Bestimmung von Werteverteilungen werden maximal 1022 Bytes eines Spaltenwertes betrachtet, unabhängig davon wie viel Bytes der Spaltenwert gemäß Definition tatsächlich belegen kann. Dadurch können die ermittelten Werteverteilungen von den tatsächlichen Werteverteilungen abweichen, wenn es Spaltenwerte gibt, die in den ersten 1022 Bytes übereinstimmen und sich erst danach unterscheiden.
Die UPDATE STATISTICS-Anweisung führt implizit pro Basistabelle eine COMMIT-Anweisung aus, d. h. die Transaktion, in der die UPDATE STATISTICS-Anweisung ausgeführt wird, ist anschließend beendet.
Die im Datenbankkatalog abgelegten Statistikwerte können durch Selektieren der Systemtabelle OPTIMIZERINFORMATION abgefragt werden. Jede Zeile der Tabelle beschreibt Statistikwerte über Indizes, Spalten oder Größe einer Tabelle.
Wenn ein Tabellenname angegeben ist, dann muss die Tabelle eine Basistabelle, darf jedoch keine temporäre Tabelle sein. Der aktuelle Datenbankbenutzer muss ein Privileg für sie besitzen.
Wenn ein Spaltenname angegeben ist, dann muss die Spalte der angegebenen Tabelle existieren.
Wenn * angegeben ist, werden alle Spalten der Tabelle angenommen.
Wenn <identifier>* angegeben ist, dann hat das den gleichen Effekt wie die Angabe der UPDATE STATISTICS-Anweisung für alle Basistabellen, für die der aktuelle Datenbankbenutzer ein Privileg besitzt und deren Tabellenname mit dem Bezeichner identifier beginnt.
Der Datenbanksystemadministrator (SYSDBA-Benutzer) kann durch UPDATE STATISTICS * erreichen, dass die UPDATE STATISTICS-Anweisung für alle Basistabellen ausgeführt wird, auch wenn dem Datenbanksystemadministrator kein Privileg für die Tabelle vergeben wurde.
● Bei Angabe von ESTIMATE und einer sample_definition schätzt das Datenbanksystem die Statistikwerte durch Auswahl von Stichproben aus dem Datenbestand. Die Anzahl der Stichproben kann in Anzahl Zeilen oder in Prozent erfolgen. Durch die Angabe von ESTIMATE kann die Laufzeit der UPDATE STATISTICS-Anweisung stark reduziert werden. Die Genauigkeit der ermittelten Statistikwerte ist in den meisten Fällen dennoch ausreichend.
● Bei Angabe von ESTIMATE ohne eine sample_definition schätzt das Datenbanksystem die Statistikwerte durch Auswahl von Stichproben aus dem Datenbestand. Die Anzahl der Stichproben wurde bei der CREATE TABLE-Anweisung oder einer ALTER TABLE-Anweisung durch eine sample_definition für die angegebene Tabelle festgelegt. Durch die Angabe von ESTIMATE kann die Laufzeit der UPDATE STATISTICS-Anweisung stark reduziert werden. Die Genauigkeit der ermittelten Statistikwerte ist in den meisten Fällen dennoch ausreichend.
● Wenn ESTIMATE nicht angegeben ist, bestimmt das Datenbanksystem exakte Statistikwerte, indem der gesamte Datenbestand der Tabelle betrachtet wird. Bei großen Tabellen kann die Laufzeit hierfür beträchtlich sein.
Der Datenbankkern trägt in die Systemtabelle SYSUPDSTATWANTED (befindet sich im Schema des Datenbanksystemadministrators) die Tabellen(spalten) ein, für die ein UPDATE STATISTICS-Lauf zweckmäßig erscheint.
Wenn Sie die SQL-Anweisung UPDATE STATISTICS AS PER SYSTEM TABLE verwenden, wird für alle in der Tabelle SYSUPDSTATWANTED enthaltenen Tabellen(spalten) ein UPDATE STATISTICS-Lauf ausgelöst. Wenn der Datenbankparameter UPDATESTAT_PARALLEL_SERVERS auf einen Wert >= 0 gesetzt ist, wird versucht, die Statistikläufe parallel durchzuführen. Anschließend werden die Einträge in der Tabelle SYSUPDSTATWANTED gelöscht.
Die Systemtabelle SYSUPDSTATWANTED kann ebenfalls durch Datenbankadministratoren geändert werden. Allerdings kann ein Datenbankadministrator nur solche Einträge einfügen, die sich auf Tabellen beziehen, dessen Eigentümer dieser Datenbankadministrator ist.
Sie können einzelne Tabellen von einem UPDATE STATISTICS-Lauf ausschließen, indem Sie mittels einer ALTER TABLE-Anweisung für diese Tabellen die Stichprobengröße auf 0 setzen (SAMPLE-Definition).
Siehe auch:
EXPLAIN-Anweisung (explain_statement)
Konzepte des Datenbanksystems, SQL-Optimierer, Statistiken des SQL-Optimierers, EXPLAIN-Anweisung
Datenbankverwaltung
im CCMS, SQL-Optimierer im CCMS,
Aktualisierung der
SQL-Optimiererstatistiken einplanen