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