nextgen databases

Willkommen auf meinen Blog rund um das Thema Datenbanken

Hier findest du praxisnahe Einblicke, Tipps und Best Practices zu Administration, Performance-Tuning und Automatisierung.

Mein Ziel ist es, komplexe Themen verständlich aufzubereiten und Lösungen zu teilen, die sich direkt im Alltag von Datenbank-Profis einsetzen lassen

Oracle Statspack – AWR ohne Diagnostic & Tuning Pack

 

In der Oracle Enterprise Edition steht das lizenzpflichtige Diagnostic & Tuning Pack als zentrales Werkzeug für Performance-Analysen zur Verfügung. Falls man mit der Standard Edition arbeitet oder das Diagnostic & Tuning Pack nicht lizenziert hat eignet sich das Oracle Statspack als gute Alternative.

 

🔍 Was ist Statspack?

Statspack ist ein kostenloses Tool von Oracle, das Performance-Daten wie Wait Events, Buffer Gets, SQL-Statistiken und vieles mehr sammelt. Es speichert diese Daten in Tabellen, die später für Analysen genutzt werden können – ähnlich wie das Diagnostic & Tuning Pack, aber ohne Lizenzkosten.

 

📈 Anwendungsgebiete

  • Performance-Vergleich zwischen verschiedenen Zeitpunkten (snapshots)
  • Identifikation von ressourcenintensiven SQL-Statements


⚙️ Installation & Einrichtung

 

AWR und Statspack sollten nicht gemeinsam auf einer Datenbank aktiviert sein, aus diesem Grund sollte es in der Enterprise Edition deaktiviert werden falls es aktiv ist. 

CDB:

SQL> conn / as sysdba SQL> show parameter control_manage NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ control_management_pack_access string NONE  -- ggf. Diagnostic and Tuning Pack entfernen. alter system set control_management_pack_access='NONE' scope=spfile; --> Datenbank neu starten!

 

PDB:

Tablespace erstellen:
 

create tablespace perfstat datafile size 500M autoextend on maxsize 3G;

 

Falls Perfstat vorher bereits installiert war sollte man es vorher entfernen:

 

@?/rdbms/admin/spdrop

 

Perfstat installieren:

 

define default_tablespace='perfstat' define temporary_tablespace='temp' @?/rdbms/admin/spcreate

 

Metrics Level anpassen:

 

Level Beschreibung
0 This level captures general statistics, including rollback segment, row cache, SGA, system events, background events, session events, system statistics, wait statistics, lock statistics, and Latch information
5 This level includes capturing high resource usage SQL Statements, along with all data captured by lower levels
6 This level includes capturing SQL plan and SQL plan usage information for high resource usage SQL Statements, along with all data captured by lower levels
7 This level captures segment level statistics, including logical and physical reads, row lock, itl and buffer busy waits, along with all data captured by lower levels
10 This level includes capturing Child Latch statistics, along with all data captured by lower levels

 

Ich persöhnlich halte Level 7 für ausreichend:

 

exec STATSPACK.MODIFY_STATSPACK_PARAMETER (i_snap_level=>7,i_modify_parameter=>'true', i_instance_number=>null);

 

Snapshot-Erstellung

 

manuell:

Das ist unter andem sinnvoll wenn man einen Lasttest auf der DB fährt damit man sicher sein kann das die Metriken während des Test enthalten sind.

 

exec statspack.snap;

 

automatisch mit dem Oracle Scheduler:
Dieser job läuft alle 15 Minuten, es werden also 4 snapshots pro Stunde erzeugt.

 

-- perfstat Rechte erteilen um scheduler jobs zu erstellen:conn / as sysdba
grant create job to perfstat;
conn perfstat/*****

-- Job zum erstellen von sapshots anlegen
BEGIN
  DBMS_SCHEDULER.create_job (
    job_name => 'STATSPACK_SNAPSHOT_JOB',
    job_type => 'PLSQL_BLOCK',
    job_action => 'BEGIN PERFSTAT.statspack.snap; END;',
    start_date => SYSTIMESTAMP,
    repeat_interval => 'FREQ=HOURLY; BYMINUTE=0,15,30,45',
    enabled => TRUE,
    comments => 'Scheduler Job to run statspack.snap every 15 minutes at fixed times'
  );
END;
/

 

Housekeeping-Job erstellen:

BEGIN
    DBMS_SCHEDULER.create_job ( job_name => 'STATSPACK_PURGE_JOB',
                                job_type => 'PLSQL_BLOCK',
                                job_action => 'BEGIN statspack.purge(i_num_days => 30, i_extended_purge => TRUE); END;',
                                start_date => SYSTIMESTAMP,
                                repeat_interval => 'FREQ=MONTHLY; BYMONTHDAY=1; BYHOUR=1; BYMINUTE=0', enabled => TRUE,
                                comments => 'Scheduler Job to purge statspack data monthly on the 1st at 01:00' );
END; /

 

Reporting:

sqlplus / as sysdba alter session set container=; SQL>  @?/rdbms/admin/spreport

 

--> Beispiel Report

 

Erwartetes Datenvolumen
Statspack-Metriken können je nach Häufigkeit und Aufbewahrungsdauer der Snapshots mehrere GB pro Datenbank beanspruchen.

Ein snapshot benötigt in etwa 1MB, im Monat wären das dann ca. 750MB bei einen snapshot pro Stunde.

 

🧠 Fazit

Statspack ist nach wie vor ein leistungsfähiges und hilfreiches Performance-Tool für Oracle-Datenbanken. Im Vergleich zum kostenpflichtigen Diagnostic and Tuning Pack bietet es zwar weniger Funktionen und wirkt technisch etwas überholt, lässt sich jedoch lizenzfrei einsetzen und eignet sich gut für grundlegende Performance-Analysen.

Autor: Mark Seidenfaden