Tools für das SQL-Tuning (Anzeigen der Ausführungspläne

Transcription

Tools für das SQL-Tuning (Anzeigen der Ausführungspläne
Inhalt
Tools für das SQL-Tuning
(Anzeigen der Ausführungspläne)
Ø
Ø
Ø
Ø
Ø
Ø
EXPLAIN PLAN
SQL*Plus Autotrace
SQL Trace und TKPROF
V$SQL_PLAN
DBMS_XPLAN
Extended SQL-Tracing
Dr. Frank Haney
1
EXPLAIN PLAN
Anweisung parsen und Tabelle füllen mit:
EXPLAIN PLAN [SET STATEMENT_ID='DEMO']
[INTO my_plan_table]
FOR
SQL-Statement;
Achtung:
Anweisung wird nicht ausgeführt!
Plan ist geschätzt und theoretisch möglich!
Auswerten z.B. mit:
SELECT id,
parent_id,
LPAD(' ', 2*(level-1))||operation||' '
||options||' '||' '||object_name plan
FROM plan_table
CONNECT BY PRIOR id=parent_id AND statement_id = 'DEMO'
START WITH id=0 AND statement_id = 'DEMO';
Oder mit den Skripten utlxpls.sql bzw. utlxplp.sql
Dr. Frank Haney
2
PLAN_TABLE
Speicherung von Ausführungsplänen, angelegt mit Skript
@$ORACLE_HOME\rdbms\admin\utlxplan.sql
STATEMENT_ID
PLAN_ID
TIMESTAMP
REMARKS
OPERATION
OPTIONS
OBJECT_NODE
OBJECT_OWNER
OBJECT_NAME
OBJECT_ALIAS
OBJECT_INSTANCE
OBJECT_TYPE
OPTIMIZER
SEARCH_COLUMNS
ID
PARENT_ID
´
DEPTH
POSITION
COST
CARDINALITY
Dr. Frank Haney
VARCHAR2(30)
NUMBER
DATE
VARCHAR2(4000)
VARCHAR2(30)
VARCHAR2(255)
VARCHAR2(128)
VARCHAR2(30)
VARCHAR2(30)
VARCHAR2(65)
NUMBER(38)
VARCHAR2(30)
VARCHAR2(255)
NUMBER
NUMBER(38)
NUMBER(38)
NUMBER(38)
NUMBER(38)
NUMBER(38)
NUMBER(38)
BYTES
OTHER_TAG
PARTITION_START
PARTITION_STOP
PARTITION_ID
OTHER
DISTRIBUTION
CPU_COST
IO_COST
TEMP_SPACE
ACCESS_PREDICATES
FILTER_PREDICATES
PROJECTION
TIME
QBLOCK_NAME
OTHER_XML
NUMBER(38)
VARCHAR2(255)
VARCHAR2(255)
VARCHAR2(255)
NUMBER(38)
LONG
VARCHAR2(30)
NUMBER(38)
NUMBER(38)
NUMBER(38)
VARCHAR2(4000)
VARCHAR2(4000)
VARCHAR2(4000)
NUMBER(38)
VARCHAR2(30)
CLOB
3
SQL*Plus AUTOTRACE
PLAN_TABLE erzeugen
Als SYS Rolle PLUSTRACE anlegen mit:
@$ORACLE_HOME\sqlplus\admin\plustrce.sql
Rolle vergeben: GRANT plustrace TO scott;
Syntax:
SET AUTOTRACE [OFF|ON|TRACEONLY] [EXPLAIN|STATISTICS]
ON = Abfrageergebnis, Ausführungsplan, Statistik
TRACEONLY = Ausführungsplan, Statistik
EXPLAIN = Abfrageergebnis, Ausführungsplan
STATISTICS = Statistik
Achtung: Anweisung wird immer ausgeführt! Plan und
Statistiken sind aber geschätzt!
Dr. Frank Haney
4
SQL Trace und TKPOF
1. Initialisierungparameter einstellen
•
•
•
•
SQL_TRACE = TRUE (Einschalten auf Instanzebene, nicht empfohlen)
TIMED_STATISTICS = TRUE
USER_DUMP_DEST = directory
MAX_DUMP_FILE_SIZE = n
2. SQL Trace auf Session-Ebene einschalten
•
•
•
ALTER SESSION SET SQL_TRACE = TRUE
EXECUTE DBMS_SESSION.SET_SQL_TRACE(TRUE)
ECECUTE DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(SESSION_ID, SERIAL_ID, TRUE)
3. SQL-Anweisung ausführen
4. SQL Trace ausschalten
5. Trace-Datei <SID>_ora_<spid>.ora mit TKPROF formatieren
•
TKPROF tracefile outputfile [OPTIONS]
Optionen:
Sortieroptionen:
z.B. sort=sortieroptionen, print, explain, sys, aggregate, table
count, CPU, elapsed, disk, query, current, misses, rows
– jeweils für parse, execute oder fetch
6. Probleme: Lesekonsistenz, DML-Sperren, rekursive SQL,
Keine Waits und Binds!
Dr. Frank Haney
5
V$SQL_PLAN
Struktur ähnlich wie PLAN_TABLE
View zeigt aber die tatsächlichen Ausführungspläne kürzlich
ausgeführter Cursor (nicht SQL-Anweisungen!) an.
1. Anweisung ausführen:
SELECT /* demo */ ...
2. Adresse und Hash-Wert des Cursor ermitteln:
SELECT sql_text, address, hash_value
FROM v$sqlarea
WHERE UPPER(sql_text) LIKE '%DEMO%';
3. Ausführungsplan anzeigen:
SELECT id, LPAD(' ', depth)||operation||' '||options
||' '||object_name plan
FROM v$sql_plan
WHERE address = UPPER('&adress')
AND hash_value = &hash_value;
Dr. Frank Haney
6
DBMS_XPLAN
PL/SQL-Package zur Anzeige von Ausführungsplänen aus:
• PLAN_TABLE: DBMS_XPLAN.DISPLAY
• Cursor Cache: DBMS_XPLAN.DISPLAY_CURSOR
• Automatic Workload Repository: DBMS_XPLAN.DISPLAY_AWR
• SQL Tuning Set: DBMS_XPLAN.DISPLAY_SQLSET
• SQL Plan Baseline: DBMS_XPLAN.DISPLAY_SQL_PLAN_BASELINE
Formatierungsoptionen:
• BASIC
• TYPICAL
• SERIAL
• ALL
• und weitere
Beispiel: Ausführungsplan eines Cursor aus dem Cursor Cache
EXEC DBMS_XPLAN.DISPLAY_CURSOR(sql_id => 'sql_id',
child_number => n, format => 'TYPICAL')
Dr. Frank Haney
7
Was verspricht Extended SQL-Tracing?
1. Extended SQL-Tracing ermöglicht nicht nur SQL-Tuning,
sondern unterstützt einen ganzheitlichen Ansatz.
2. Die Methode ist deterministisch: Die Auswirkungen von
Tuningmaßnahmen auf die Performance sind vorhersagbar.
3. Es gibt nur zwei Kriterien: Antwortzeit und Kosten
4. Statistiken können spezifisch für die als problematisch
ermittelte Nutzeraktion gesammelt werden.
5. Meßfehler sind eher beherrsch- bzw. eliminierbar.
6. Der Beitrag jedes einzelnen Database Calls zur Antwortzeit
läßt sich ermitteln.
7. Die Performance-Implikationen eigentlich „unzugänglicher“
Nutzeraktionen (Fremdapplikationen) werden transparent.
8. Gezeigt wird die tatsächliche SQL-Ausführung!
Dr. Frank Haney
8
Methoden für das Extended SQL-Tracing
Oracle’s Pseudo-Error Debugging Events
•
•
•
•
Fehler-Nummern von 10000 - 10999
Eine komplette Liste findet sich in $ORACLE_HOME/rdbms/mesg/oraus.msg (Leider
nicht auf Windows-Plattformen!)
Event 10046 = Extended SQL-Tracing
Für eigene Sitzung setzen:
alter session set events '10046 trace name context forever, level 8';
•
Statistik-Ebenen (level):
Dr. Frank Haney
Level
Funktion
0
keine Statistik
1
entspricht SQL_TRACE = TRUE
2
Derzeit identisch mit 1
4
1 + BINDS
8
1 + WAITs
12
1 + BINDS + WAITs
9
Starten und Stoppen für fremde Session
1.
ORADEBUG
oradebug setorapid <pid>
oradebug event 10046 trace name context forever, level 12
>> Benutzeraktionen
oradebug event 10046 trace name context off
oradebug close_trace
2.
DBMS_SUPPORT
execute dbms_support.start_trace_in_session(<sid>, <serial#>,
waits => TRUE, binds => TRUE);
>> Benutzeraktionen
execute dbms_support.stop_trace_in_session(<sid>, <serial#>);
3.
DBMS_SYSTEM
execute dbms_system.set_ev( <sid>, serial#>, 10046, 12);
>> Benutzeraktionen
execute dbms_system.set_ev(<sid>, <serial#>, 10046, 0);
4.
DBMS_MONITOR (ab 10g)
execute dbms_monitor.session_trace_enable( <sid>, serial#>,
true, true);
>> Benutzeraktionen
execute dbms_monitor. session_trace_disable( <sid>, serial#>);
Dr. Frank Haney
10
Probleme
1. Von Oracle im Level > 1 offiziell nicht unterstützt (bis 10g)
2. Wird in der Oracle-Dokumentation und den meisten TuningBüchern wenig oder gar nicht behandelt
3. Mißverständnisse über die Wirkungsweise selbst bei Experten
4. Es gibt keine Tools zum adäquaten Sammeln der Daten.
5. Unterschiedliche Maßeinheiten (cs bis 8i vs. s ab 9i)
6. Kaum Standard-Tools zur Interpretation der Trace Files
•
•
•
•
TKPROF gibt keine totale Antwortzeit einer Session. Außerdem werden Ereignisse
zwischen den Calls nicht richtig interpretiert und die Zuordnung der rekursiven SQL ist
schwierig.
Der Trace Analyzer (TRCA) wird von Oracle offiziell nicht unterstützt. (C. Sierra –
http://support.oracle.com)
TVDXTAT (Trivadis Extended Tracefile Analysis Tool – C. Antognini
http://antognini.ch/2008/10/introduce-tvdxtat/)
ORASRP (Oracle Session Resource Profiler – E. Starostin http://oracledba.ru/orasrp/)
Dr. Frank Haney
11
Auswerten der Trace Files
Zu beachten sind dabei:
• Vorwärtsattributierung
• Rekursive Tiefe (Child Cursor)
• Ereignisse innerhalb der und zwischen den Calls
• Idle und nonidle waits
Elemente der Trace Files
• Session- und Anwendungsinformationen sowie Timestamp
• Cursor Identifikation: PARSING IN CURSOR
• Database Calls: PARSE, EXECUTE, FETCH
• Warteereignisse: WAIT
• Bindevariablen: BINDS
• Ausführungsplan (Row Source): STAT
• Transaktionsende: XTEND
Dr. Frank Haney
12
TKPROF
Das Oracle Standard-Tool zur Auswertung von Trace Files zeigt
Ø
Ø
Ø
Ø
Ø
Ø
Ø
Ø
Ø
Anzahl der Parse-, Execute und Fetch Calls
CPU- und Gesamtzeit
Physische und logische Lesevorgänge
Anzahl der verarbeiteten Zeilen
Fehlschläge im Library Cache (Hard Parses)
Benutzername unter dem der jeweilige Parse Call stattfand
Jedes Commit und Rollback
Wait Events data für jedes SQL-Statement sowie eine Zusammenfassung
Ausführungspläne
Syntax:
tkprof <infile> <outfile> [waits=yes|no] [sort=option] [print=n]
[aggregate=yes|no][sys=yes|no][explain=user/password]
Achtung: Wenn die Informationen über mehrere Trace Files verteilt sind (z.B. bei
Shared Server bzw. beim modul- oder servicebasiereten Tracen), müssen diese erst
mit dem Tool trcsess zusammengefaßt werden.
Dr. Frank Haney
13
Trace Analyzer
Ausgabe wichtiger Informationen durch den Trace Analyzer:
ØDie totale für den User verwendete Zeit (CPU, Elapsed, Nonidle Waits, Idle Waits)
ØDie gleichen Angaben für die TOP 5 SQL-Anweisungen
ØZusammenfassung der Waits (Nonidle, Idle)
ØDie 5 meistbenutzten Blöcke
ØZusammenfassung von CPU, Elapsed und Waits, Physical Reads, Logical Reads,
Library Cache Misses je Cursor
ØViele Detailinformationen über den einzelnen Cursor
Der Trace Analyzer wird installiert mit dem Skript trcacrea.sql
Berichte werden ausgegeben
Ø für den kompletten Inhalt des Trace Files mit trcanalzr.sql
Ø für einen einzelnen Cursor mit trcacrsr.sql
Ø für eine einzelne Cursor-Ausführung mit tracaexec.sql
Nachteil: Muß als Schema in der Datenbank installiert werden.
Dr. Frank Haney
14
SQLTXPLAIN – Enhanced Execution Plan
Eingabe von SQL und Ausgabe einer menge von Dateien mit diagnostischen
Informationen:
Ø Ausführungspläne
Ø Verwendete Optimizer-Statistiken
Ø Parametereinstellungen
Ø Metadaten der Schemaobjekte
Ø Ausführungsstatistiken für die SQL
Wird installiert und bedient mittels SQL-Skripten
Installiert ein Schema als Repository in der Datenbank
Methoden
Ø XTRACT, wenn sql_id oder hash_value bekannt sind, und die SQL im Speicher ist
Ø XECUTE mit Übergabe des Statements
Ø XPLAIN funktioniert analog zu EXPLAIN PLAN FOR …
Ø COMPARE hilft verschiedene System zu vergleichen
Dr. Frank Haney
15
Der Optimizer intern – Event 10053
Das Pseudo-debugging Event 10053 liefert einen Trace File mit:
Ø SQL-Text
Ø Vom Optimizer verwendete Parameter (auch verborgene)
Ø Basistatistiken (Kardinalität, Anzahl der Blöcke, Indexhöhe, Clustering-Faktor etc.)
Ø Vergleich der Zugriffskosten auf die Basistabellen (FTS vs. Index Scan)
Ø Vergleich der Ausführungspläne (z.B. Join-Ausführung, Join-Reihenfolge)
ØViele Detailinformationen über den einzelnen Cursor
Verwendung durch den Kunden nur auf Anforderung durch den Support!
Setzen des Events:
ALTER SESSION SET EVENTS '10053 trace name context forever, level 1'
oder (für fremde Session)
DBMS_SYSTEM.SET_EV(<sid>, serial#>, 10053, 1)
SQL ausführen
ALTER SESSION SET EVENTS '10053 trace name context off‚
oder
DBMS_SYSTEM.SET_EV(<sid>, serial#>, 10053, 0)
Dr. Frank Haney
16

Documents pareils