Als PDF Downloaden!

Werbung
Tipps & Tricks: September 2016
Bereich:
DBA, Tuning
Erstellung:
09/2016 KW
Versionsinfo:
9.2, 10.1, 10.2, 11.1, 11.2, 12.1
Letzte Überarbeitung:
09/2016 KW
Wir finden einen Schatz - SQLT, Teil 2
Schon seit Ewigkeiten gibt es ein Tool zur Performance-Analyse von SQL-Statements: ständig weiterentwickelt
und auch intern eingesetzt von Oracle, kostenlos, auch ohne Diagnostic- und Tuning-Pack nutzbar und - in weiten
Kreisen - unbekannt. Gründe genug, das Tool an dieser Stelle vorzustellen und einen
"Performance-Tuning-Schatz" einem größeren Publikum zugänglich zu machen. Teil 1 beinhaltete die Vorstellung
des Tools und erläutert die Installation. Hier nun, in Teil 2, werden die Analyse-Möglichkeiten mit SQLT
beleuchtet.
Die Suche geht weiter - Performance-Analyse von
SQL-Statements mit SQLT
Skripte und Aufbau der Testumgebung
Für die folgenden Analysen werden die Skripte vom <SQL_ROOT>-Verzeichnis aus ausgerufen, also dem
Verzeichnis, in das SQLT nach dem Download entpackt wurde, und das sowohl die Installations- als auch
Performance-Analyse und Testskripte enthält.
Unter <SQL_ROOT>/run liegen die Skripte, die zur Analyse aufgerufen werden.
Bereits in unserem Monatstipp August 2016 wurde erwähnt, dass mit SQLT Skripte zur Verfügung gestellt
werden, mit denen ein Testschema angelegt werden kann. Diese Skripte befinden sich im
SQLT-Root-Verzeichnis unter <SQL_ROOT>/input/sample/minidb.
Skripte mit ausgewählten SQL-Statements legten die Entwickler von SQLT freundlicherweise unter unter
<SQL_ROOT>/input/sample ab. So muss man sich für einen ersten Eindruck nicht alles selbst "aus den Fingern
saugen", sondern kann diese Beispiele ohne großen Aufwand verwenden. :)
Für diesen Monatstipp wird ebenfalls mit diesen Skripten gearbeitet. So können Sie es leicht "nachspielen" und
die Funktionsweise von SQLT kennenlernen. Los geht's!
Zu Beginn wird das Schema QTUNE wie folgt installiert und befüllt:
cd <SQLT_ROOT>/input/sample/minidb
sqlplus sys as sysdba
-- Erstellung Testschema qtune
start create_user.sql
-- Befüllung Testschema qtune:
conn qtune/qtune
start create_order_entry_db.sql
Muniqsoft GmbH
Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40
IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0
Seite 1 von 4
Der Schatz wird erarbeitet - Methoden
SQLT bietet viele Möglichkeiten zur SQL-Statement-Analyse, in der SQLT-Dokumentation werden sie
"Methoden" genannt. Je nach Einsatzzweck muss die geeignete Methode (sprich: das geeignete Skript)
eingesetzt werden. Für die Wahl der geeigneten Methode (sprich: des geeigneten Skripts) muss in erster Linie
geklärt sein:
1.) Ist die SQL_ID oder das PLAN_HASH_VALUE des zu analysierenden Statements bekannt? Oder steht der
Statementtext zur Verfügung?
2.) Soll/kann das Statement aus dem Memory oder dem AWR ausgelesen werden oder gebe ich das zu
analysierende Statement als Textfile mit?
3.) Wie umfangreich soll die Analyse sein? Soll zum Beispiel das Statement erneut ausgeführt werden oder ist
unter Umständen die einfache Erstellung eines möglichen Ausführungsplanes ausreichend?
Aus der Kombination der Antworten auf diese Fragen ergibt sich, welche Methode zur Performance-Analyse mit
SQLT gewählt werden sollte. Es liegt in der Verantwortung des Datenbankadministrators oder Entwicklers, die zu
seiner Problemstellung passende Methode auszuwählen. Allen Methoden ist gemeinsam, dass sie nur ein
Statement analysieren. Es existiert zwar eine Methode, der mehrere Statements mitgegeben werden können,
aber auch hier werden diese Statements nicht gleichzeitig sondern nacheinander analysiert.
Im Folgenden sollen einige Methoden vorgestellt werden:
1. XTRACT
Eine andere Methode - XTRACT - wird mit der SQL_ID oder dem PLAN_HASH_VALUE als Parameter
aufgerufen. Die SQL-Statistiken werden direkt aus dem Memory oder dem AWR abgezogen und so ist diese
Methode etwas schneller als die oben genannte. Nachteil ist, dass man keinerlei Daten bekommt, wenn das
Statement nicht mehr im Memory oder im AWR enthalten ist. Für Anwender ohne Diagnostic-Pack und somit
ohne Zugriff auf das AWR ist dieser Nachteil noch gravierender. Aufgerufen wird XTRACT wie folgt:
sqlplus qtune/qtune
start run/sqltxtract.sql 1pzqzvnzaucy oracle
Die SQL_ID wurde zuvor aus gv$sql ermittelt.
2. XECUTE
XECUTE ist eine Methode, die das zu analysierende Statement per Textfile erhält und dieses vollständig laufen
lässt, bevor die Auswertung beginnt. Der Aufruf lautet so:
sqlplus qtune/qtune
start run/sqltxecute.sql input/sample/script2.sql oracle
Alternativ, wenn der Testuser QTUNE nicht installiert wurde, aber das Beispielschema SH von Oracle auf einer
Spieledatenbank vorhanden ist, kann man sich damit verbinden und das SQL-Statement im Textfile script1.sql
ausführen:
sqlplus sh/sh
start run/sqltxecute.sql input/sample/script1.sql oracle
Natürlich kann jedes beliebige SQL-Statement in diesen Textdateien stehen. Wichtig ist, dass der User, mit dem
SQLT aufgerufen wird - hier also "QTUNE" oder "SH" - Zugriff auf die Objekte hat sowie die Rolle
Muniqsoft GmbH
Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40
IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0
Seite 2 von 4
Natürlich kann jedes beliebige SQL-Statement in diesen Textdateien stehen. Wichtig ist, dass der User, mit dem
SQLT aufgerufen wird - hier also "QTUNE" oder "SH" - Zugriff auf die Objekte hat sowie die Rolle
SQLT_USER_ROLE verliehen bekommen hat. "oracle" ist in diesem Fall das Passwort des Users SQLTXPLAIN.
Diesem User gehört das Repository, in das die Performance-Daten und Ausführungspläne "hineingesammelt"
werden. Das Passwort wird benötigt, um die Daten aus dem Repository zu exportieren. Nach dem Export werden
die einzelnen Files in einem Zip-File zusammengefasst.
3. XTRXEC
Diese Methode kombiniert die ersten beiden Methoden. Die Methoden werden nacheinander aufgerufen. Per
XTRACT werden der Statementtext, Bindevariable aus dem Bind Peeking sowie Ausführungspläne aus dem
Memory oder AWR ermittelt, anschließend wird das erhaltene Statement per XECUTE erneut prozessiert und die
Performance analysiert.
sqlplus qtune/qtune
start run/sqltxtrxec.sql 1pzqzvnzaucy oracle
4. XPLAIN
XPLAIN ist die letzte Methode, die an dieser Stelle aufgeführt werden soll. Es wird verwendet, wenn schnell ein
möglicher Ausführungsplan für ein Statement dargestellt werden soll. Bei der Verwendung von XPLAIN werden
weder Bindevariablen noch zur Laufzeit ermittelten Statistiken berücksichtig. Es ist das Pendant zu EXPLAIN
PLAN FOR im Sql*Plus mit dem Vorteil, dass die Ergebnisse im SQLT-Repository abgespeichert werden und dort
später auch wieder abrufbar und vergleichbar sind.
XPLAIN sollte - ob seiner Ungenauigkeiten und des geringen Informationsgehaltes - nur eingesetzt werden,
wenn XECUTE und auch XTRACT aus Performance-Gründen nicht eingesetzt werden können. Der Aufruf sieht
so aus:
sqlplus sh/sh
start run/sqltxplain.sql input/sample/sql1.sql oracle
Es gibt darüberhinaus viele weitere, sehr nützliche Methoden, deren Erläuterung aber den Rahmen dieses
Monatstipps sprengen würde.
Der Schatz wird gehoben - Analyse und Reports
Der Output von SQLT-Files umfasst so ziemlich alles, was sich ein Performence-tunender
Datenbankadministrator, Tester oder Entwickler nur wünschen kann. Zuerst einmal: alle Daten, die zu der
getunten Session gehören, werden letztlich in einem Zip-File gespeichert.
Nach dem Entpacken kann man die Datei sqlt_xxxxxx_main.html aufrufen und sich durchklicken: Zuoberst sind
Auffälligkeiten und Hinweise gelistet. Dort steht zum Beispiel, ob es veraltete Statistiken gibt, ob Optimizer
Parameter vom Default abweichen und ob die Statistikjobs aktiviert sind. Weitere Kapitel im Report enthalten die
getracten SQL-Statements, NLS-Parameter für die Session/Instance/Datenbank, Bindevariablen, Cursor,
Ausführungspläne und Laufzeiten. Es folgen Details zur Ausführung des SQLs, also SQL Statistiken, Session
Statistiken, Events und - falls vorhanden - Parallelprozesse. Weiterhin finden sich Angaben zu Tabellen, deren
Statistiken, Constraints, Indices und Histogrammen. Abgeschlossen wird der Report von Daten zu
Objektabhängigkeiten, Tablespaces sowie DDL Statements zum Anlegen der beteiligten Objekte. Sofern das
Diagnostic-Pack oder das Diagnostic- und Tuning-Pack genutzt werden kann, wird der Report durch diese
zusätzlichen Informationen ergänzt.
Wem dieser Report zu erschlagend ist, hat die Möglichkeit, die Datei sqlt_xxxxxx_lite.html anzusehen. Hier gibt
es die wichtigsten Informationen: Ausführungspläne des Statements, sowie Statistiken zu den Tabellen und
Indices, auf die zugegriffen wurde.
Muniqsoft GmbH
Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40
IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0
Seite 3 von 4
Wer sich ausführlicher für die Tracefiles interessiert, greift auf die Datei sqlt_xxxxxx_trca_exxxxx.html zu.
Als wenn es noch nicht genug wäre - Tipps & Tricks
Ein weiteres interessantes Feature, das auch SQLT-intern für die Reports verwendet wird und sozusagen als
"Nebenprodukt" verwendet werden kann, ist die Möglichkeit konventionell erzeugte Tracefiles
zusammenzufassen. Dies ist dann nützlich, wenn ein Statement getract wird, das parallele Aktionen durchführt.
Hier wird für jeden einzelnen Parallelprozess ein separates Tracefile erstellt. SQLT erstellt daraus ein einziges
Tracefile und - wenn gewünscht - wertet es dieses Tracefile auch aus.
Auch die umgekehrte Variante - das Splitten von Tracefiles - ist möglich. Wird zum Beispiel für eine Session ein
SQL Trace (Event 10046) und ein Optimizer Trace (Event 10053) gleichzeitig ausgeführt, so schreibt Oracle alle
Traceinformationen zu diesem Prozess in ein einziges Tracefile. Dieses kann mit SQLT-Skripte wieder in
separate Files gesplittet werden und erleichtert so die Auswertung.
Erwähnenswert ist, dass SQLT auch Statements analysieren kann, die auf einer Standby-Datenbank im
Read-Only-Modus laufen. Dafür muss der Connect auf der Primary Database erfolgen, die Analyse erfolgt dann
über einen Datenbanklink, der von der Primary- auf die Standby-Datenbank zeigt.
Die Analyse mit SQLT kann auch von einem Oracle-Client remote erfolgen. Voraussetzung dafür ist, dass die
SQLT-Skripte auf dem Clientrechner entpackt sind und eine SQL*Net Verbindung zur Datenbank besteht.
Zusätzlich muss zu Beginn in der SQL*Plus Session der Connect Identifier für die Datenbank gesetzt werden,
damit die Skripte nicht mit dem Fehler "ORA-20106: SQLT parameter connect_identifier must be set when
running SQLT from a remote client" abbrechen:
EXEC sqltxadmin.sqlt$a.set_sess_param('connect_identifier', '@dwh12');
Und das war erst der Anfang
SQLT bietet neben den hier vorgestellten Features noch weit mehr, die "Advanced Methods and Modules".
Vielleicht haben Sie Lust bekommen, sich selbst auf Schatzsuche zu begeben? Es gibt noch viel zu entdecken.
Für weitere Information stehen wir gern zur Verfügung - zum Beispiel im Rahmen einer SQL Tuning Schulung.
Ebenso gern unterstützen Sie unsere erfahrenen Consultants bei Ihnen vor-Ort oder per Remote-Support.
Quellen bzw. zum Weiterlesen:
All About the SQLT Diagnostic Tool - MOS-Note 215187.1
SQLT (SQLTXPLAIN) Frequently Asked Questions - MOS-Note 1454160.1
SQLT Main Report: Usage Suggestions - MOS-Note 1922231.1
Muniqsoft GmbH
Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40
IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0
Seite 4 von 4
Herunterladen