Systemstatistiken

Sammeln von Systemstatistiken. Bei der Berechnung der Kosten für die Zugriffspfade durch den Optimizer sind Informationen über Zugriffszeiten des I/O-Systems und die Geschwindigkeit des Prozessors notwendig. Diese Informationen können über die Prozedur GATHER_SYSTEM_STATS mit dem Package DBMS_STATS gesammelt werden. Sind diese Informationen nicht verfügbar, verwendet der Optimizer Standardwerte, die vom realen System abweichen und somit evtl. falsche Informationen bei der Auswahl eines geeigneten Zugriffspads liefern. Die Sammlung der Systemstatistiken sollte bei Belastung des Systems durchgeführt werden, um entsprechend aussagekräftige Werte zu erhalten. Zusätzlich könnte es sinnvoll sein, die Systemstatistiken zu unterschiedlichen Zeiträumen sammeln zu lassen, falls das System in diesen Zeiträumen unterschiedliche Lastprofile besitzt. Diese könnten beispielsweise Tages- und Nachtbetrieb sein, weil nachts Jobs ausgeführt werden, während tagsüber die Datenbank im reinen OLTP-Betrieb läuft.

Systemstatistiken werden nicht automatisch gesammelt, und es gibt auch keinen Menüpunkt im Database Control für ihre Sammlung. Das Sammeln der Systemstatistiken muss manuell zu repräsentativen Zeiträumen eingeleitet werden.

Die aktuellen Systemstatistiken befinden sich in der Tabelle SYS.AUX_STATS$.

SQL> DESCRIBE SYS.AUX_STATS$

 Name                    Null?    Typ
 ----------------------- -------- --------------
 SNAME                   NOT NULL VARCHAR2(30)
 PNAME                   NOT NULL VARCHAR2(30)
 PVAL1                            NUMBER
 PVAL2                            VARCHAR2(255)

 

SQL> SELECT * FROM  SYS.AUX_STATS$; 

SNAME           PNAME                PVAL1 PVAL2
--------------- --------------- ---------- ----------------
SYSSTATS_INFO   STATUS                     COMPLETED
SYSSTATS_INFO   DSTART                     09-30-2010 13:29
SYSSTATS_INFO   DSTOP                      09-30-2010 13:31
SYSSTATS_INFO   FLAGS                    1
SYSSTATS_MAIN   CPUSPEEDNW      1683,65129
SYSSTATS_MAIN   IOSEEKTIM               10
SYSSTATS_MAIN   IOTFRSPEED            4096
SYSSTATS_MAIN   SREADTIM          78311,25
SYSSTATS_MAIN   MREADTIM         60531,066
SYSSTATS_MAIN   CPUSPEED              1091
SYSSTATS_MAIN   MBRC                     2
......

13 Zeilen ausgewählt.

 

Beschreibung der Systemstatistiken:

STATUS

Status der Sammlung

DSTART

Startzeit der Sammlung

DSTOP

Endzeit der Sammlung

CPUSPEEDNW

CPU-Geschwindigkeit. Wird bei jedem Instanzstart gemessen.

IOSEEKTIM

Latenzzeit für des I/O-Systems in Millisekunden

IOTFRSPEED

Transferrate des I/O-Systems in Millisekunden

SREADTIM

Lesezeit eines einzelnen Blockes in Millisekunden

MREADTIM

Lesezeit von Multiblöcken bei Full-Table- oder Fast-Full-Index-Scans in Millisekunden

CPUSPEED

CPU-Geschwindigkeit.

MBRC

Durchschnittliche Anzahl der Blöcke beim Lesen einer Blocksequenz bei Full-Table- und Fast-Full-Index-Scans

 

Das Sammeln der Systemstatistiken kann entweder durch ein manuelles Starten und Stoppen oder durch Angabe eines Zeitintervalls durchgeführt werden.

Starten und Stoppen des Sammelvorgangs der Systemstatistiken:


SQL> EXEC DBMS_STATS.GATHER_SYSTEM_STATS('START')
PL/SQL-Prozedur erfolgreich abgeschlossen.

SQL> EXEC DBMS_STATS.GATHER_SYSTEM_STATS('STOP')
PL/SQL-Prozedur erfolgreich abgeschlossen.

 Sammeln von Systemstatistiken über ein Intervall von 10 Minuten:


SQL> EXEC DBMS_STATS.GATHER_SYSTEM_STATS(INTERVAL=>10,
                     GATHERING_MODE=>'INTERVAL')
PL/SQL-Prozedur erfolgreich abgeschlossen.

Besitzt die Datenbank zu unterschiedlichen Zeiträumen ein anderes Lastprofil, so kann für jeden Zeitraum die entsprechende Systemstatistik gesammelt und geladen werden. Dafür muss eine Statistiktabelle mit der Prozedur CREATE_STAT_TABLE erstellt werden, in der die zu sammelnden Statistiken abgespeichert werden. Beim Start des Sammelvorgangs wird der Prozedur GATHER_SYSTEM_STATS diese Tabelle und ein Bezeichner für die zu speichernde Statistik übergeben. Soll nun eine Statistik geladen werden, so wird die Prozedur IMPORT_SYSTEM_STATS verwendet, indem man wieder die Tabelle und den Bezeichner für die Statistik übergibt.

Im folgenden Beispiel wird eine Tabelle TABSYSSTATS erstellt, in der für das tägliche Lastprofil die Systemstatistik mit dem Bezeichner STATDAY abgelegt wird. Das Gleiche wird für das nächtliche Lastprofil durchgeführt, für das die Statistik den Bezeichner STATNIGHT erhält. Morgens werden nun die Statistiken für den Tag und abends die Statistiken für die Nacht geladen.

 

Erstellen der Statistiktabelle:


SQL> EXEC DBMS_STATS.CREATE_STAT_TABLE('SYS','TABSYSSTATS','SYSAUX')
PL/SQL-Prozedur erfolgreich abgeschlossen.

 Erstellen der Systemstatistiken für den Tag:


SQL> EXEC DBMS_STATS.GATHER_SYSTEM_STATS('START', STATTAB=>'TABSYSSTATS',
                                          STATID=>'STATDAY')
 PL/SQL-Prozedur erfolgreich abgeschlossen.

 

 SQL> EXEC DBMS_STATS.GATHER_SYSTEM_STATS('STOP', STATTAB=>'TABSYSSTATS',
                                          STATID=>'STATDAY')

 PL/SQL-Prozedur erfolgreich abgeschlossen.
 

Erstellen der Systemstatistiken für die Nacht:

SQL> EXEC DBMS_STATS.GATHER_SYSTEM_STATS('START', STATTAB=>'TABSYSSTATS',
                                          STATID=>'STATNIGHT')
PL/SQL-Prozedur erfolgreich abgeschlossen.

 

SQL> EXEC DBMS_STATS.GATHER_SYSTEM_STATS('STOP', STATTAB=>'TABSYSSTATS',
                                         STATID=>'STATNIGHT')
PL/SQL-Prozedur erfolgreich abgeschlossen.

Laden der Systemstatistiken für den Tag:

SQL> EXEC DBMS_STATS.IMPORT_SYSTEM_STATS(STATTAB=>'TABSYSSTATS',
                                        STATID=>'STATDAY')
PL/SQL-Prozedur erfolgreich abgeschlossen.

Laden der Systemstatistiken für die Nacht:


SQL> EXEC DBMS_STATS.IMPORT_SYSTEM_STATS(STATTAB=>'TABSYSSTATS',
                                       STATID=>'STATNIGHT')
PL/SQL-Prozedur erfolgreich abgeschlossen.