pl/sql - doag.org · pdf file• pl/sql wird jetzt optimiert durch einen optimierenden...
TRANSCRIPT
Copyright ORDIX AG PL/SQL - Debugging und -Tuning 1
Beate KünnekeSenior Consultant, ORDIX AG, [email protected]
Deutsche OracleAnwenderkonferenz 2006
PL/SQLDebugging und -Tuning
Copyright ORDIX AG PL/SQL - Debugging und -Tuning 2
Agenda
- Motivation
- PL/SQL-Debugging
- PL/SQL-Tuning
- Fragen & Antworten
Copyright ORDIX AG PL/SQL - Debugging und -Tuning 3
Motivation
SQL> start prc_auswertung; ???
SQL> PL/SQL-Prozedur erfolgreich abgeschlossen.
Copyright ORDIX AG PL/SQL - Debugging und -Tuning 4
Agenda
- Motivation
- PL/SQL-Debugging
- PL/SQL-Tuning
- Fragen & Antworten
Copyright ORDIX AG PL/SQL - Debugging und -Tuning 5
Übersicht PL/SQL-Debugging
• Datenbankseitige Unterstützung• dbms_output• eigene Lösung• dbms_profiler• dbms_debug
• Oracle-Tools• JDeveloper• SQL-Developer
• Andere Tools
Copyright ORDIX AG PL/SQL - Debugging und -Tuning 6
DBMS_OUTPUT
• Datenbankseitiges Package• Ausführungsrecht ist „public“• Ausgabe auf dem Bildschirm/in Spool-Datei auf dem aufrufenden
Rechner• Ausgabe von „beliebigem“ Text• Steuerung in SQL*PLUS über set serveroutput on
einfach, kann bereits während der Implementierung eingefügt werden
erst nach dem Schreiben des Buffers sichtbar
keine Beeinflussung während des Programmablaufs möglich
Copyright ORDIX AG PL/SQL - Debugging und -Tuning 7
DBMS_OUTPUT- Beispiel -
CREATE OR REPLACE PROCEDURE m_total_gehalt(gesamt OUT NUMBER) ASCURSOR mitarbeiter_cursor IS
SELECT gehaltFROM mitarbeiter;
zaehler NUMBER(10) := 1;BEGIN FOR mitarbeiter_record IN mitarbeiter_cursor LOOP
gesamt := 0;gesamt := gesamt + mitarbeiter_record.gehalt;DBMS_OUTPUT.PUT_LINE('Schleifendurchlauf='||zaehler|| ' Summe Gehalt = ' || to_char(gesamt));zaehler := zaehler + 1;
END LOOP;
DBMS_OUTPUT.PUT_LINE('Gesamtgehalt = ' || to_char(gesamt));END m_total_gehalt;
Copyright ORDIX AG PL/SQL - Debugging und -Tuning 8
DBMS_OUTPUT- Beispiel Ausgabe -
Die Ausgabe sieht dann wie folgt aus:
- Schleifendurchlauf = 1 Summe Gehalt = 2000
- Schleifendurchlauf = 2 Summe Gehalt = 2500
- Schleifendurchlauf = 3 Summe Gehalt = 3000
- Schleifendurchlauf = 4 Summe Gehalt = 2700
- Gesamtgehalt = 2700
Copyright ORDIX AG PL/SQL - Debugging und -Tuning 9
DBMS_OUTPUT
• Die Ausgabe ist nun nicht mehr beschränkt auf 1.000.000 Zeichen
SET SERVEROUTPUT ON SIZE UNLIMITED FORMAT WORD_WRAPPED
• Die maximale Zeilengröße ist ab Version 10g 32767(bisher 255 Zeichen)
• Eine ähnliche Funktionalität zur Ausgabe in das Filesystem desServers bietet utl_file
Copyright ORDIX AG PL/SQL - Debugging und -Tuning 10
Eigene Lösung
• Als Erweiterung zu dbms_debug gedacht
• Protokollierung in eine Tabelle
• Durch autonome Transaktionen sofort abgreifbar
• Damit detaillierte Analyse möglich
• Ein-/Ausschalten durch Setzen von Schaltern möglich
- auf Session-Ebene
- durch Eintrag in Tabelle auch währenddes Programmablaufs möglich
• Ergebnisse können auch rückwirkend noch ausgewertet werden
einfach, flexibel, gute Auswertemöglichkeiten
Copyright ORDIX AG PL/SQL - Debugging und -Tuning 11
Eigene Lösung- Implementierung -
CREATE TABLE debug_log(zeitstempel TIMESTAMP,text VARCHAR2(4000));
CREATE OR REPLACE PACKAGE pck_debugas schalter BOOLEAN:=FALSE; procedure put_line(p_text IN VARCHAR2);END;/CREATE OR REPLACE PACKAGE BODY pck_debugas procedure put_line(p_text IN VARCHAR2) IS PRAGMA AUTONOMOUS_TRANSACTION; begin IF schalter THEN INSERT INTO DEBUG_LOG VALUES (SYSTIMESTAMP,P_TEXT); COMMIT; END IF; end;END;/
Copyright ORDIX AG PL/SQL - Debugging und -Tuning 12
Eigene Lösung- Beispiel -
...
pck_debug.schalter:=true; -- pck_debug.schalter:=false; FOR pc_kn IN c_kn_vorhanden( pc_pad.bp_kenn,
pc_pad.nl,pc_pad.biber, pc_pad.stammnummer)
LOOP pck_debug.put_line('KN: '||pc_pad.bp_kenn||' bereits
angelegt');
...SELECT * FROM debug_log ORDER BY zeitstempel;
Copyright ORDIX AG PL/SQL - Debugging und -Tuning 13
Eigene Lösung- Ausblick -
Flexibilität ???
Beispiel:- Breakpoints
• Steuerung über Einträge in eine Steuertabelle undeiner Funktion mit Warteschleife bis Wert gesetzt ist
- Setzen von Variablenwerten• analog zu oben• Rückgabe des „neuen“ Variablenwertes
Copyright ORDIX AG PL/SQL - Debugging und -Tuning 14
DBMS_DEBUG
• PL/SQL-Package, somit unmittelbar verfügbar
• erfordert 2 Sessions:
- Target: Erstellen von Debug-Information
- Debug-Session: Steuerung der Target-Session
Flexibles Debuggen durch Setzen von Breakpoints,Anzeigen von Variablenwerten
Source-Code muss zum Debuggen nicht verändert werden
Aufwändig durch die Erstellung von notwendigem Quelltext
für das Debuggen von komplexen Programmteilen sinnvoll
Copyright ORDIX AG PL/SQL - Debugging und -Tuning 15
DBMS_DEBUG- Typische Fragen -
• Wie heißt das Programm?
• In welcher Zeile befinde ich mich?
• Wie groß ist die Stacktiefe?
• Wie sieht der Quell-Code der aktuellen Zeile aus?
• Mit welchen Werten sind die Variablen belegt?
Copyright ORDIX AG PL/SQL - Debugging und -Tuning 16
DBMS_DEBUG- Ablauf -
für die Target Session:• Session zum Debuggen
initialisieren
• Debugging starten
• PL/SQL Programm ausführen
• Debugging stoppen
für die Debug-Session:• DBMS_DEBUG.attach_session()
mit der Debug-Id der Target-Session
• Manipulieren der Breakpoints
• Synchronisation => Abgreifen derInformation zu einem Event
• Setzen von Variablen
• Anzeige des zugehörigenSourcecodes
• Weitere Ausführung anstoßen(CONTINUE)
• Ist das Programm fertig?
• DBMS_DEBUG.detach_session()
Copyright ORDIX AG PL/SQL - Debugging und -Tuning 17
DBMS_PROFILER
Bietet Funktionalitäten für Debugging und Performance-Analyse!
• Debugging in Form von:
• Welche Zeile wurde wie oft durchlaufen?
• Performance Analyse:
• Wieviel Kosten hat das pro Zeile(total, Minimum, Maximum) verursacht?
Copyright ORDIX AG PL/SQL - Debugging und -Tuning 18
DBMS_PROFILER- Ablauf -
• Voraussetzung: PROFTAB.SQL oder PROFLOAD.SQL
• Start des Profiling- DBMS_PROFILER.START_PROFILER
• Ausführen der zu analysierenden Programmteile- exec mdb_import.pad;
• Wegschreiben der gesammelten Informationen- DBMS_PROFILER.FLUSH_DATA/ DBMS_PROFILER.STOP_PROFILER;
• Auswertung über- PLSQL_PROFILER_RUNS- PLSQL_PROFILER_UNITS- PLSQL_PROFILER_DATA
Copyright ORDIX AG PL/SQL - Debugging und -Tuning 19
SQL-Developer
• Kostenfreies Tool von Oracle• Java-Anwendung (28.9 M wenn JDK 1.5 bereits installiert)• Welche Objekte können debuggt werden?
- Proceduren, Funktionen, Packages- unterstützt
• Haltepunkte• Anzeige von Variablenwerte• Setzen von Variablenwerten
=> was passiert wenn...• Hineinbewegen in untergeordnete Objekte
Copyright ORDIX AG PL/SQL - Debugging und -Tuning 20
SQL-Developer
Copyright ORDIX AG PL/SQL - Debugging und -Tuning 21
JDeveloper
• JPDA (java platform debugger architecture)- Industriestandard für Java Debugging- unterstützt
• Haltepunkte• Anzeige von Variablenwerte• Setzen? Von Variablenwerten
=> was passiert wenn...
• Welche Objekte können debuggt werden?- Stored Procedures und Funktions- Packages
Copyright ORDIX AG PL/SQL - Debugging und -Tuning 22
JDeveloper
• Voraussetzungen- Modus INTERPRETED (nicht NATIVE)- Rechte
• DEBUG ANY PROCEDURE• DEBUG CONNECT SESSION
- Kompilierung des Objektes mit der Option DEBUG• ALTER <procedure, function, package <name> COMPILE DEBUG;• Jdeveloper: Auswahl Tools/Preferences/Database Connections
=>Generate PL/SQL Debug Information
• Debugging-Arten- Lokaler Aufruf im JDeveloper- Manuelles Starten des Programmes aus SQL*PLUS,...
Anbindung eines Debugger-Prozesses
Copyright ORDIX AG PL/SQL - Debugging und -Tuning 23
Jdeveloper- Lokaler Aufruf -
Copyright ORDIX AG PL/SQL - Debugging und -Tuning 24
Jdeveloper- Remote Debugging and Profiling -
Copyright ORDIX AG PL/SQL - Debugging und -Tuning 25
Agenda
- Motivation
- PL/SQL-Debugging
- PL/SQL-Tuning
- Fragen & Antworten
Copyright ORDIX AG PL/SQL - Debugging und -Tuning 26
Übersicht PL/SQL-Tuning
• Tracing- dbms_trace- dbms_monitor- dbms_application_info- tkprof
• Tuning- Verbesserungen der Version 10g- Tipps- Harness Software Kit
Copyright ORDIX AG PL/SQL - Debugging und -Tuning 27
Dbms_trace
• Voraussetzung: sys muss tracetab.sql ausführen- => 2 Tabellen und 1 Sequenz wird erzeugt- SYS.PLSQL_TRACE_RUNS
welcher user hat wann Trace durchgeführt- SYS.PLSQL_TRACE_EVENTS
enthält die eigentlichen Informationen
• Es können Level festgelegt werden- trace_all_calls / trace_enabled_calls- trace_all_exceptions / trace_enabled_exceptions- trace_all_sql / trace_enabled_sql- trace_all_lines / trace_enabled_lines:
• Die zu tracenden Programmeinheiten müssen mit der DebugOption kompiliert werden.
Copyright ORDIX AG PL/SQL - Debugging und -Tuning 28
Dbms_trace- Beispiel -
ALTER PROCEDURE TRACE_TEST COMPILE DEBUG;ALTER PROCEDURE test_proc COMPILE DEBUG;
PROCEDURE TRACE_TEST IS test_ex EXCEPTION;BEGIN -- Tracing beginnen: DBMS_TRACE.SET_PLSQL_TRACE(DBMS_TRACE.trace_enabled_exceptions); DBMS_TRACE.SET_PLSQL_TRACE(DBMS_TRACE.trace_all_calls );
test_proc; RAISE test_ex; -- Tracing beenden (wird hier aber wegen RAISE nicht abgearbeitet) DBMS_TRACE.CLEAR_PLSQL_TRACE;EXCEPTION WHEN test_ex THEN DBMS_TRACE.CLEAR_PLSQL_TRACE; WHEN OTHERS THEN DBMS_TRACE.CLEAR_PLSQL_TRACE;END;SELECT * FROM SYS.PLSQL_TRACE_EVENTSWHERE RUNID=(SELECT MAX(RUNID) FROM SYS.PLSQL_TRACE_RUNSWHERE RUN_OWNER = 'SCOTT')
Copyright ORDIX AG PL/SQL - Debugging und -Tuning 29
Dbms_application_info
• Performance kann pro Modul analysiert werden
• dazu muss die Applikation registriert werden
• Ressourcenbelegung kann ebenfalls ermittelt werden
• sichtbar in v$session und v$sqlarea
• Information über langlaufende Operationen:v$session_longops
Copyright ORDIX AG PL/SQL - Debugging und -Tuning 30
Dbms_application_info- Beispiel -
CREATE or replace PROCEDURE add_employee(name VARCHAR2,salary NUMBER,manager NUMBER,title VARCHAR2,commission NUMBER,department NUMBER) AS
BEGINDBMS_APPLICATION_INFO.SET_MODULE(
module_name => 'add_employee',action_name => 'insert into emp');
INSERT INTO emp(ename, empno, sal, mgr, job, hiredate, comm, deptno)VALUES (name, emp_seq.nextval, salary, manager, title, SYSDATE,commission, department);
DBMS_APPLICATION_INFO.SET_MODULE(null,null);END;
Copyright ORDIX AG PL/SQL - Debugging und -Tuning 31
tkprof - Ausführung
• Einschalten des Tracing für eine Session• Analysezeitraum abwarten• Ausschalten des Tracing• Trace Datei identifizieren• Trace Datei mit tkprof bearbeiten (Betriebssystem)• Ausgabe analysieren
dbms_system.set_sql_trace_in_session(<session_id>, <serial_id>, TRUE
);
dbms_system.set_sql_trace_in_session( <session_id>, <serial_id>, FALSE
);
user_dump_destuser_dump_dest <db_name>_ora_<spid>.ora<db_name>_ora_<spid>.ora
Trace.txtTrace.txt
tkprof tracefile outfile <parameter>
Copyright ORDIX AG PL/SQL - Debugging und -Tuning 32
Session Tracing– Übersicht (10g) -
DBClient
ora
• SID: Identifiziert eine Session zu einem Zeitpunkt• SERIAL#: historisch eindeutig für eine Session• MODULE: frei wählbar mit dbms_application_info.set_module• ACTION: frei wählbar mit dbms_application_info.set_action
Client DispatcherServer
ora
ora
Client
WebserverClient
Client
Tracing mit Oracle 9sehr schwierig
Copyright ORDIX AG PL/SQL - Debugging und -Tuning 33
DBMS_MONITOR (10g)
• Einfachen SQL Trace aktivieren und deaktivieren
- SESSION_TRACE_ENABLE(7,4634, TRUE, FALSE);- SESSION_TRACE_DISABLE(7,4634);
• SQL Trace für mehrere Sessions- SERV_MOD_ACT_TRACE_ENABLE- SERV_MOD_ACT_TRACE_DISABLE
WaitsBinds
UDUMP
Copyright ORDIX AG PL/SQL - Debugging und -Tuning 34
SERV_MOD_ACT_TRACE (10g)
SERV_MOD_ACT_TRACE_ENABLE(
,service_name
,module_name ,action_name
,waits
,binds
,instance_name
);
dbms_application_info.set_module
dbms_application_info.set_action
RAC spezifisch
init.ora/tnsnames: service_name
Wait Events
Bind Variablen
Copyright ORDIX AG PL/SQL - Debugging und -Tuning 35
Auswertung TRCSESS (10g)
trcsess [output=output_file_name] = neue Tracedatei [session=session_id] = sid.serial# [clientid=client_id] [service=service_name] [action=action_name] [module=module_name] [trace_files] Default = *.* im aktuellen Verz.
Beispiel:trcsess output=gehalt.trc session_id=21.12345 action=gehalttkprof ... gehalt.trc gehalt.out
• Trace Informationen über mehrere Trace-Dateien verteilt• Programm trcsess sucht Informationen aus mehreren Dateien• trcsess erzeugt eine Trace-Datei mit zusammengehörenden Infos
Copyright ORDIX AG PL/SQL - Debugging und -Tuning 36
DBMS_MONITOR (10g)
• SQL Statistiken mit DBMS_MONITOR- SERV_MOD_ACT_STAT_ENABLE- SERV_MOD_ACT_STAT_DISABLE
SERV_MOD_ACT_STAT_ENABLE(, service_name IN VARCHAR2, module_name IN VARCHAR2, action_name IN VARCHAR2 DEFAULT ALL_ACTIONS);
• Instance-Name implizit gleich aktuelle Instance• Deaktivieren mit SERV_MOD_ACT_STAT_DISABLE• Semantik wie serv_mod_act_trace_enable / disable
Copyright ORDIX AG PL/SQL - Debugging und -Tuning 37
PL/SQL Tuning (10g)
• PL/SQL wird jetzt optimiert durch einen optimierenden Compiler(Code Generator):- What you write is NOT what you get!
• Initialisierungsparameter PLSQL_OPTIMIZE_LEVEL (Default 2)
• Ausschalten durch PLSQL_OPTIMIZE_LEVEL = 0
• Verbesserungen in 10g:- bei der Rekursion- bei der Verwendung Expression innerhalb von Schleifen- bei der Verwendung von Variablen- ...
Copyright ORDIX AG PL/SQL - Debugging und -Tuning 38
Harness Software Kit
• Tools zur Unterstützung der Entwickler
• Performanceunterschiede von PL/SQL-Programmesind damit messbar
• Freier Download
• 30 Testprogramme
• Nutzung auch für eigene PL/SQL-Programme
• Vorgefertigte Reports
• Kann ab Version 8 verwendet werden
Copyright ORDIX AG PL/SQL - Debugging und -Tuning 39
PL/SQL Tuning (10g)
• Tuning der enthaltenen SQL-Befehle• Funktionen unterstützen durch funktions-basierte Indizes• Möglichst wenig SQL-Befehle in Schleifen• Nutzung von FORALL• Nutzung von BULK COLLECT bei SELECT INTO• Sind OUT-Parameter nötig/NOCOPY• Standardfunktionen nutzen• Logische Test mit dem günstigsten Vergleich zuerst• Datentyp-Konvertierung vermeiden,
Numerische Datentypen: PLS_INTEGER/BINARY_FLOAT• Gruppieren von Funktionen/Prozeduren in Packages• Festhalten der Packages im Shared Pool mit dbms_shared_pool
Copyright ORDIX AG PL/SQL - Debugging und -Tuning 40
Copyright ORDIX AG PL/SQL - Debugging und -Tuning 43
einfach.gut.beraten.
Vielen Dank für IhreAufmerksamkeit!
Besuchen Sie uns anunserem Stand C11- in der Nähe von !