Wenn’s mal hakt bei DB2

Immer wieder kommt es vor, dass Abfragen auf DB2-Tabellen nur sehr langsam ausgeführt werden. Performance-Tuning ist keine triviale Angelegenheit und sollten DB2-Admins durchführen. Ungeachtet dessen, kann man sich als Entwickler trotzdem ein Bild von der jeweiligen DB2-Konfiguration machen.

DB2 Statistiken

Über die DB2 Statistiken versucht DB2 Datenbankzugriffe zu optimieren. Dies setzt voraus dass Statistik-Informationen aktuell vorliegen. Die Statistiken werden über RUNSTAT und REORG erzeugt. Möchte man beispielsweise wissen, wann die Statistiken zuletzt erzeugt wurden, so kann über eine Abfrage auf die SYSIBM.SYSTABLES oder über die View SYSCAT.TABLES diese Information gewinnen.

Folgende SQL-Query zeigt die Informationen je Tabelle in einem Schema mit den gewünschten Informationen – CARD (Datensatzanzahl) und STATS_TIME (Datum, wann die Statistiken zuletzt erzeugt wurden):

SELECT TABSCHEMA, TABNAME, CARD, STATS_TIME FROM SYSIBM.SYSTABLES ORDER BY CARD DESC;
alternativ
SELECT TABSCHEMA, TABNAME, CARD, STATS_TIME FROM SYSCAT.TABLES ORDER BY CARD DESC;

DB2 Konfiguration ermitteln

Über das DB2-CLI können DB2 Konfigurationen abgefragt werden. Hierbei sollte bereits ein Filter (z.B. mit egrep) auf die entsprechenden Parameter gesetzt werden, außer man möchte sich die gesamte Konfiguration anzeigen lassen.

db2 get database configuration for DBAIMH01 | egrep 'LOGFILSIZE|LOGPRIMARY|LOGSECOND|NEWLOGPATH|Path'

Ist man sich gänzlich unsicher, welche DB2-Version man überhaupt installiert hat, hilft das Kommando db2level weiter. Diese Kommando muss ohne Parameter auf der Kommandozeile eingegeben werden.

db2level

Ebenfalls gängig ist die Auswertung mit Hilfe eines snapshots. Dazu kann beispielsweise auf der Kommandozeile folgendes Statement nützliche Informationen ausgeben:

db2 get snapshot for all on DBAIMH01 | egrep 'Secondary'

db2advis

Zur Optimierung von Datenbankabfragen kann auch das Kommandozeilen Werkzeug db2advis eingesetzt werden. Mit dem Parameter -d wird die Datenbank und dem Parameter -s ein entsprechendes SQL-Statement ausgeführt. Der Parameter -t gibt an wie viele Minuten die Abfrage maximal ausgeführt werden soll.

db2advis -d DBAIMH01 -l query.sql -t 5

EXPLAIN PLAN

Mit EXPLAIN PLAN kann für ein auszuführendes Statement ein Abfrage Plan erstellt werden. Nutzt man beispielsweise DBeaver als Datenbank-Client werden die Ergebnisse einer Abfrage in den EXPLAIN-Tabellen abgespeichert. Wichtig ist, dass die EXPLAIN-Tabellen entweder im Schema SYSTOOLS vorhanden sind (ist nicht Standard) oder die Berechtigung vorhanden ist in einem User-Schema die EXPLAIN-Tabellen anzulegen.

Möchte man das Ergebnis eines Abfrage Plans in den EXPLAIN-Tabellen erzeugen, so setzt man vor das eigentliche SQL-Statement folgendes EXPLAIN Statement:

EXPLAIN PLAN FOR
SELECT * FROM SCHEMA.TABELLE;

Durch das Voranstellen von EXPLAIN PLAN FOR wird das eigentliche SELECT-Statement nicht ausgeführt, jedoch der Abfrageplan erstellt und das Ergebnis in die EXPLAIN-Tabellen geschrieben. Diese können im Nachgang „ganz normal“ mit SELECT-Statements abgefragt und analysiert werden:

z. B.
SELECT * FROM SYSTOOLS.EXPLAIN_INSTANCE
oder
SELECT * FROM SYSTOOLS.EXPLAIN_ARGUMENT WHERE EXPLAIN_REQUESTER = ‚userid‘
etc.

DBeaver – Eclipse Plugin für DB2

DBeaver ist ein freier SQL Client für zahlreiche Datenbanken, ich verwende ihn als Eclipse-Plugin für DB2. DBeaver verfügt über ein paar tolle Funktionen.

DBeaver generate SQL

Ein wirklich nützliches Feature von DBeaver ist die Möglichkeit SQL-Statements zu generieren. Am folgenden Beispiel wird gezeigt, wie aus einer Ergebnismenge eines SELECT’s – INSERT Statements generiert werden können. Diese INSERT Statements können dann z.B. als Vorlage für Anpassungen und Generierung von „synthetischen“ Testdaten dienen. Voraussetzung: DBeaver Ansicht ist ausgewählt.

Um einen simplen SELECT * auf eine Tabelle auszuführen, muss die Tabelle mit der Maus markiert werden und über das Kontextmenü der Eintrag „Read data in SQL console“ ausgewählt werden.

Anschließend wird in der Konsole das Ergebnis eines SELECT * angezeigt – hier am Beispiel der S_BIZ_ANTRAG Tabelle.

In der Konsole müssen aus der Ergebnismenge die relevanten Datensätze mit der Maus markiert werden. Dies kann

  • die gesamte Ergebnismenge sein (i.d. R. die ersten 1000 Records) – Markierung der ges. Tabelle,
  • ein Bereich (Markierung über Shift und/oder Maustaste)
  • einzelne Datensätze (Markierung mit Strg und Maustaste) oder
  • ein einziger Datensatz (Markierung eines einzelnen Datensatzes über die Zeilen-Nummer) sein.

Nach getroffener Auswahl über das Kontextmenü den Eintrag  „Generate SQL –> z.B. INSERT“ auswählen.

Es erscheint ein neues Fenster in dem die selektierten Datensätze als INSERT-Statements generiert werden.

Diese generierten Statements können nun über copy/paste bspw. nach Notepad++ kopiert und angepasst werden. Man muss sich bei den generierten Statements um keine Datentypen kümmern, da diese beim Generieren von DBeaver gleich korrekt erzeugt werden.

DBeaver compare

DBeaver kann auch Objekte, die im Datenbank Navigator angezeigt werden, strukturell vergleichen. Dies funktioniert mit jedem Objekt (Tabellen, Schemata, ganze Datenbanken etc.) – natürlich müssen die zu vergleichenden Objekte vom gleichen Typ sein.

Im Datenbanknavigator die zu vergleichenden Objekte – hier Tabellen – mit der Maustaste markieren und anschließend im Kontextmenü den Eintrag <Compare> auswählen:

Im anschließend erscheinenden Dialog weitere Optionen auswählen und das Ausgabeformat Datei/Browser auswählen.

 

Datenbank-Monitoring mit DB2TOP

In meinem aktuellen Data Warehouse Projekt verwende ich das db2-Monitoring Tool DB2TOP. Mit diesem textbasierten Tool können db2-Umgebungen überwacht werden.

Starten und Beenden von DB2TOP

Um DB2TOP aufzurufen, muss man sich über putty mit dem DB-Server verbinden und anschließend auf der Kommandozeile db2top eingeben (in manchen Fällen gefolgt vom Parameter -d für den DB-Namen und den Namen der Datenbank):

Aufruf von db2top
[y0e6844@blbbddbentw01] $ db2top -d dbbded01

Anschließend wird DB2TOP gestartet und das Hauptmenü angezeigt.

DB2TOP Startseite

Im oberen Bereich von DB2TOP werden verschiedene Werte angezeigt.

Kopfzeile 1:

  • linker Bereich in der Kopfzeile
  • [/]: Wenn dieses Symbol rotiert, bedeutet es, dass DB2TOP zwischen zwei Snapshots wartet – anderenfalls wartet DB2TOP auf eine Antwort von DB2h
  • 08:25:29: aktuelle Uhrzeit
  • refresh=2secs: Zeit Intervall für die Aktualisierung zwischen zwei Snapshots
  • refresh=!secs: Ein angezeigtes Ausrufezeichen bedeutet, dass die Verarbeitungszeit eines Snapshots länger dauert als die refresh-Zeit. Wenn dies der Fall ist, erhöht DB2TOP den Zeitintervall um 50%.
  • (0.001): Dauer die benötigt wurde, um den Snapshot zu erzeugen
  • rechter Bereich in der Kopfzeile
  • Linux: Plattform, auf der die DB2-Instanz läuft
  • member=[1/1]: Zeigt im Falle von Partitionen die aktive von gesamt vorhandenen Partitionen an
  • BADISE01: DB-Instanz-Name
  • DBBDBD01: Datenbank-Name

Kopfzeile 2:

  • linker Bereich in der Kopfzeile
  • d=Y/N: Delta oder Kumulativer Snapshot Indikator (-k oder k Option)
  • a=Y/N: Nur aktive oder alle Objekte (-a oder i Option)
  • e=Y/N: erweiterte Anzeige
  • p=ALL: Alle Datenbank-Partitionen (p=CUR aktuelle DB-Partition, p=2: Partition 2, sofern partitioniert) (-P Option ohne Angabe einer Partition)
  • rechter Bereich in der Kopfzeile
  • qp=on/off: Query patroller an/aus

Zusätzlich werden auf der Startseite von DB2TOP die möglichen Tastenkommandos zur Navigation angezeigt (Achtung: Groß-/Kleinschreibung beachten).

Beenden von DB2TOP

DB2TOP kann durch die Eingabe von q (quit) beendet werden. Möchte man DB2TOP nicht beenden, dennoch auf der Linux-Shell Befehle ausführen, so kann durch die Eingabe eines Ausrufezeichens temporär auf die Linux-Shell gewechselt werden – durch Eingabe von exit wird die Shell wieder verlassen und man befindet sich wieder in der DB2TOP Ansicht.

d (Database)

Auf der Datenbank-Seite werden eine Reihe von Performance Monitoring Elemente für die gesamte Datenbank angezeigt

Database

Auslastungs-Anzeige (durch Eingabe von g aktivier-/deaktivierbar)

  • MaxActSessions: Aktive Sessions
  • AssAgents: ??
  • SortMemory: Auslastung Sortier-Speicher
  • LogUsed: Auslastung des DB2-Transaktions-Logs (WICHTIG!!) von „uncommitted transactions“
  • FCM BufLow: FCM (Fast Communication Manager) buffer shared memory

Neben der Auslastungs-Anzeige werden Informationen (Datum/Uhrzeit/Log) zum letzten Backup angezeigt (Hinweis: Diese Angabe wird nur dann angezeigt, wenn das putty-Fenster entsprechend groß gewählt wird).

Felder:

  • Start Date Start Time: Startdatum und Uhrzeit wann die Datenbank hochgefahren wurde
  • Status:  Status der Datenbank
  • Shthres: Sort heap threshold Konfigurations-Parameter
  • Buffers: konfigurierter Buffer-Speicher in Mega-/Gigabyte
  • FCMBuf: konfigurierter FCM-Speicher in Mega-/Gigabyte
  • OtherMem: sonstiger konfigurierter Speicher im Mega-/Gigabyte
  • Sessions: Anzahl Sessions
  • ActSess: Anzahl aktiver Sessions
  • LockUsed:  Prozentuale Auslastung des LOCK-Bereichs – zusammen mit LockEscals: Lock Escalation interessant bei Locking-Problemen
  • DeadLocks:
  • LogReads:
  • LogWrites:
  • L_Reads: Logical Reads
  • P_Reads: Physical Reads
  • HitRatio:
  • A_Reads: Asynchronous Reads
  • Writes:
  • A_Writes: Asynchronous Writes
  • Lock Wait:
  • Sortheap:
  • SortOvf: Sort Overflow (dieser Wert geht hoch, wenn Sortheap nicht groß genug ist)
  • PctSortOvf: Percentage Sort Overflow
  • AvgPRdTime: Average Physical Read Time
  • AvgDRdTime: Average Direct Read Time
  • AvgPWrTime: Average Physical Write Time
  • AvgDWrTime: Average Direct Write Time

B (Bottleneck)

Bottleneck

Durch die Eingabe eines großen B’s bekommt man die Hauptkonsumenten kritischer Serverressourcen zu sehen. Hierüber können Engpässe analysiert werden. In der Darstellung werden (typischerweise) alle 2 Sekunden die Analyseergebnisse aktualisiert. Möchte man eine Eingabe „einfrieren“ so kann über die Taste f die Anzeige eingefroren werden – durch die Eingabe von <ENTER> erfolgt wieder die dynamische Anzeige.

Im oberen Bereich des Monitors erfolgt eine Pegel-Anzeige mit prozentualer Angabe der „Ausschläge“. Durch die Eingabe von z oder Z kann die Sortierreihenfolge (nach anschließender Eingabe der Spalten-Nummer) ausgewählt werden. Soll nach mehreren Spalten sortiert werden, so sind die Spalten-Nummern getrennt durch Komma anzugeben. Soll diese Sortierreihenfolge dauerhaft beibehalten bleiben, so besteht die Möglichkeit durch die Eingabe von w die „Konfiguration“ zu speichern. Die Konfigurationsdatei heißt .db2toprc.

l (Sessions)

Über die Sessions werden Anweisungsanzeigen aufgerufen.

Sessions

Benötigt man zu einer Anweisung (Application Handle) detailliertere Informationen, so kann durch die Eingabe eines kleinen a’s (agent) und anschließender Eingabe des in der ersten Spalte angezeigten Application-Handles (sowas Ähnliches wie eine Prozess-ID – ist aber nicht zu verwechseln mit der Linux/Unix Prozess-ID) ein Application Handle ausgewählt werden. Ein Application-Handle manuell eingeben funktioniert nicht – am Besten die ID mit der Maus markieren und copy/paste mit anschließendem <ENTER> drücken.

Sessions

Spaltenreihenfolge der Anzeige (dauerhaft) ändern, funktioniert wie folgt:

  • Im Sessions-Screen die Taste c eingeben. Dadurch werden alle verfügbaren und aktuell sortierten Spalten aufgelistet.
  • Danach im unteren Bildschirmbereich bei „Enter new columns order for sessions“ durch Komma getrennt die Nummer der oben angeführten Spalten in der gewünschten Reihenfolge angeben und mit <ENTER> bestätigen.
  • Soll die Darstellung dauerhaft gespeichert werden, einfach w eingeben und mit <ENTER> bestätigen.

D (Dynamic SQL)

Dynamic SQL zeigt detaillierte Informationen zu gecachten SQL Statemens an. Über die Angabe des angezeigten HashValues des SQL-Statements kann ein vollständiges SQL-Statement eingeblendet werden.

Dynamic SQL

O (Settings)

Über die Settings-Funktion werden die aktuellen Einstellungen von DB2TOP angezeigt:

DB2TOP Einstellungen

h (Help)

Über die Taste h wird eine Hilfeseite mit den zur Verfügung stehenden Tastaturkürzeln und eine kurze Beschreibung angezeigt. Die Hilfeseite beendet man durch die Eingabe von <ENTER>.

DB2TOP Hilfe

Weiterführende Informationen zum DB2TOP Monitoring Tool findet man auf den developerWorks Seiten von IBM. Besonders interessant ist der Bereich unter „What can be monitored by db2top“ von Tao Wang und Shen Li.