PL/SQL-Performance-Tuning in 11g

Werbung
PL/SQL-Performance-Tuning
in 11g
DOAG Konferenz Nürnberg 2009
Dr. Hildegard Asenbauer
MuniQSoft GmbH
Gegründet 1998
Tätigkeitsbereiche:
Oracle Schulungen
Oracle IT Consulting & Services
Software Lösungen
Oracle Lizenzen
MuniQSoft GmbH
Grünwalder Weg 13 a
D-82008 Unterhaching
www.muniqsoft.de
+49 89 6628 6789-0
MuniQSoft GmbH
DOAG 2009 PL/SQL Performance-Tuning
Seite 2
Tuning
Datenbank-Tuning
DBA
SQL-Tuning
Entwickler
PL/SQL-Tuning
Entwickler
MuniQSoft GmbH
DOAG 2009 PL/SQL Performance-Tuning
Seite 3
Vermeidung wiederholter Ausführungen
Vor 11g:
Statische Tabellen in PL/SQL-Arrays vorhalten
Returnwert von Funktionen in Variablen speichern
Vorteil: schnellerer Zugriff
Nachteile:
nur innerhalb der gleichen Session
Keine Invalidierung bei Änderungen
Speicherverbrauch
MuniQSoft GmbH
DOAG 2009 PL/SQL Performance-Tuning
Seite 4
11g: RESULT CACHE
Result Cache in SGA  Session-übergreifend
Neuer Parameter result_cache_max_size
Muss > 0 sein
Default abhängig von anderen init.ora-Parametern
(memory_target / sga_target / shared_pool_size)
In SQL und PL/SQL nutzbar
SQL: result_cache_mode bzw. Hint result_cache
MuniQSoft GmbH
DOAG 2009 PL/SQL Performance-Tuning
Seite 5
RESULT CACHE
Schlüsselwort RESULT_CACHE bei Funktionsdeklaration
Package-Funktionen: Header UND Body
Bei Zugriff auf Tabellen: RELIES_ON
Package-Funktionen: Body
Cache wird bei Tabellenänderung automatisch invalidiert
ACHTUNG: KEIN Fehler, wenn Klausel fehlt!
Funktion wird bei weiteren Aufrufen nicht ausgeführt,
wenn sich Parameter-Werte nicht geändert haben
MuniQSoft GmbH
DOAG 2009 PL/SQL Performance-Tuning
Seite 6
RESULT CACHE
Gespeichert werden:
Input-Parameter
Ergebnis
Invalidierung:
Cache wird für EIGENE Session während offener
Transaktion nicht mehr genutzt
Invalidierung erst bei COMMIT
 Lesekonsistenz ist gewährleistet
MuniQSoft GmbH
DOAG 2009 PL/SQL Performance-Tuning
Seite 7
Beispiel
CREATE OR REPLACE PACKAGE p_cache
AS
FUNCTION f_dept_count(p_deptno in number)
RETURN NUMBER RESULT_CACHE ;
END;
/
CREATE OR REPLACE PACKAGE BODY p_cache
AS
FUNCTION f_dept_count(p_deptno IN NUMBER)
RETURN NUMBER RESULT_CACHE
RELIES_ON (emp)
IS
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM emp
WHERE deptno = p_deptno;
RETURN v_count;
END;
END;
/
MuniQSoft GmbH
DOAG 2009 PL/SQL Performance-Tuning
Seite 8
Einschränkungen zum RESULT CACHE
Keine OUT-Parameter
Keine Selects auf SYS-Tabellen und -Views
Nur skalare Parameter
Keine LOBs, Ref Cursor oder Objekte als Returntypen
Nicht zulässig bei Invoker Rights
MuniQSoft GmbH
DOAG 2009 PL/SQL Performance-Tuning
Seite 9
Bulk Binds
Bereits ab Version 8i verfügbar, seither laufend
Erweiterung der Syntax
Verwendung von Collections zwingend
Seit Version 9.2 sind Records als Datentyp erlaubt
Bei Cursor FOR-Schleifen implizites Bulk DML durch
Parameter plsql_optimize_level möglich
MuniQSoft GmbH
DOAG 2009 PL/SQL Performance-Tuning
Seite 10
Bulk Binds
Bulk Select
SELECT .. BULK COLLECT INTO ..
FETCH .. BULK COLLECT INTO .. [LIMIT X]
Speicherplatz wird nicht automatisch wieder freigegeben
Bulk DML
FORALL i IN x..y [SAVE EXCEPTIONS]
FORALL i IN INDICES OF v_arr
[BETWEEN x AND y] [SAVE EXCEPTIONS]
FORALL i IN VALUES OF v_arr [SAVE EXCEPTIONS]
MuniQSoft GmbH
DOAG 2009 PL/SQL Performance-Tuning
Seite 11
Bulk Binds in 11g
Endlich kann im DML-Befehl auf einzelne Felder des
Records zugegriffen werden!
Damit uneingeschränkt für alle DML-Befehle nutzbar:
FORALL i IN
UPDATE
SET
WHERE
v_rec.FIRST..v_rec.LAST
tab
col1 = v_rec(i).field1
col2 = v_rec(i).field2;
FORALL i IN v_rec.FIRST..v_rec.LAST
DELETE FROM tab
WHERE col1 = v_rec(i).field1;
MuniQSoft GmbH
DOAG 2009 PL/SQL Performance-Tuning
Seite 12
PLSQL_OPTIMIZE_LEVEL
Parameter in 10g eingeführt, mögliche Einstellungen:
0: keine zusätzlichen Optimierungen, Verhalten wie 9i
1: Optimierungen wie Entfernung unnötiger Berechnungen
2 (Default): weitergehende Optimierungen
z.B. implizite Umwandlung von CURSOR FOR-Schleifen in
BULK SELECT
Erweiterung in 11g:
3: weitergehend als 2
u.a. auch automatisches Inlining
MuniQSoft GmbH
DOAG 2009 PL/SQL Performance-Tuning
Seite 13
PLSQL_OPTIMIZE_LEVEL
Auf System- / Session-Ebene einstellbar
ALTER SYSTEM
SET PLSQL_OPTIMIZE_LEVEL=1;
ALTER SESSION
SET PLSQL_OPTIMIZE_LEVEL=3;
Für einzelne Programmeinheit einstellbar
ALTER PROCEDURE <my_proc> COMPILE
plsql_optimize_level=3;
DD-View: DBA_PLSQL_OBJECT_SETTINGS
MuniQSoft GmbH
DOAG 2009 PL/SQL Performance-Tuning
Seite 14
Native Kompilierung
Erstellung von Maschinencode, Interpreter-Schritt entfällt
Eingeführt in 9i, aber umständlich
Vereinfachung in 10g:
automatische Suche nach OS-spezifischem C-Compiler
(GCC, VC++, .Net)
Datei $ORACLE_HOME/plsql/spnc_commands
Weiter C-Compiler und externes Verzeichnis nötig
Parameter PLSQL_OPTIMIZE_LEVEL muss mindestens
auf 2 stehen
MuniQSoft GmbH
DOAG 2009 PL/SQL Performance-Tuning
Seite 15
Native Kompilierung 11g
Kein C-Compiler mehr nötig
Kein externes Verzeichnis mehr nötig
Speicherung im SYSTEM-Tablespace
Einzig nötiger Parameter: PLSQL_CODE_TYPE
Neuer Datentyp SIMPLE_INTEGER
MuniQSoft GmbH
DOAG 2009 PL/SQL Performance-Tuning
Seite 16
Native Kompilierung
Gültige Werte für PLSQL_CODE_TYPE:
NATIVE
INTERPRETED
Native Kompilierung einstellbar:
Auf System- und Sessionebene
ALTER SESSION SET PLSQL_CODE_TYPE = 'NATIVE' ;
Auf Prozedurebene
ALTER PROCEDURE <my_proc> COMPILE
PLSQL_CODE_TYPE = NATIVE;
MuniQSoft GmbH
DOAG 2009 PL/SQL Performance-Tuning
Seite 17
SIMPLE_INTEGER
Subtyp von PLS_INTEGER
Gleicher Wertebereich (-2.147.483.648 bis 2.147.483.647)
NOT NULL Constraint
Kein Überlauf, stattdessen Wrapping
Nur bei Nativer Kompilierung mit Vorteilen
MuniQSoft GmbH
DOAG 2009 PL/SQL Performance-Tuning
Seite 18
Inlining
Inlining verhindert Overhead bei Aufruf von Subroutinen
Pragma: INLINE
PRAGMA INLINE (prozedur, 'YES' | 'NO');
PLSQL_OPTIMIZE_LEVEL >= 2
Position: unmittelbar vor Aufruf
Automatisches Inlining: PLSQL_OPTIMIZE_LEVEL = 3
Quellcode bliebt unverändert
MuniQSoft GmbH
DOAG 2009 PL/SQL Performance-Tuning
Seite 19
NOCOPY
Compiler Hint, kann bei OUT und IN OUT Parametern
angegeben werden:
PROCEDURE p_nocopy
(p_array IN OUT NOCOPY MY_PACK.t_array)
Bewirkt Übergabe BY REFERENCE statt BY VALUE
Kein Umkopieren, sondern Übergabe der Speicheradresse
Kann bei PLSQL_OPTIMIZE_LEVEL > 1 auch automatisch
erfolgen
MuniQSoft GmbH
DOAG 2009 PL/SQL Performance-Tuning
Seite 20
SQL in PL/SQL
Hauptproblem bei echten Performance-Engpässen!
 SQL Tuning nötig
Benutzen Sie Bind-Variablen!
Lagern Sie SQL-Befehle in eigene Module aus und
vermeiden Sie Duplizierungen!
MuniQSoft GmbH
DOAG 2009 PL/SQL Performance-Tuning
Seite 21
Vermischtes
Testen Sie unter realistischen Bedingungen
Achten Sie auf Randbedingungen (verfügbare
Ressourcen, parallele Sessions vs. Einzelsession, ...)
Halten Sie Sperren möglichst kurz
Modularisieren Sie und achten Sie auf saubere
Programmabläufe
Stellen Sie bei bedingten Anweisungen aufwendige
Überprüfungen ans Ende
Pipelined Functions können die Antwortzeit
beschleunigen
MuniQSoft GmbH
DOAG 2009 PL/SQL Performance-Tuning
Seite 22
Performance-Messung
Einfachste Möglichkeit (in Testphase): Zeitmessung
DBMS_UTILITY.get_time
DBMS_UTILITY.get_cpu_time
v_begin := DBMS_UTILITY.get_cpu_time;
p_do_proc1;
v_end := DBMS_UTILITY.get_cpu_time;
DBMS_OUTPUT.put_line ('Zeit Methode 1: '
||(v_end - v_begin));
MuniQSoft GmbH
DOAG 2009 PL/SQL Performance-Tuning
Seite 23
Performance-Messung
DBMS_PROFILER:
Welche Programme wurden aufgerufen?
Welche Zeilen wurden wie oft abgearbeitet?
Wie lange dauerte die Abarbeitung einer Zeile gesamt,
minimal, maximal?
Wie lange dauerte der gesamte Lauf?
Output landet in (vorher anzulegenden) Tabellen
MuniQSoft GmbH
DOAG 2009 PL/SQL Performance-Tuning
Seite 24
Performance-Messung
3 Funktionen:
v_start := DBMS_PROFILER.START_PROFILER;
v_flush := DBMS_PROFILER.FLUSH_DATA;
v_stop
MuniQSoft GmbH
:= DBMS_PROFILER.STOP_PROFILER;
DOAG 2009 PL/SQL Performance-Tuning
Seite 25
Performance-Messung 11g
DBMS_HPROF:
Hierarchische Beziehungen (Parents, Children)
Anzahl der Aufrufe
Dauer (Function bzw. Subtree)
getrennte Namespaces für SQL und PL/SQL
Directory-Objekt nötig, Output landet in Datei:
DBMS_HPROF.START_PROFILING('MYDIR', 'test.trc');
MuniQSoft GmbH
DOAG 2009 PL/SQL Performance-Tuning
Seite 26
Performance-Messung 11g
Daraus können (vorher anzulegende) Tabellen gefüllt werden:
v_id := DBMS_HPROF.ANALYZE (LOCATION=>'MYDIR',
FILENAME=>'test.trc',
RUN_COMMENT=>'TEST');
Erzeugung von HTML-Reports durch plshprof (11.1.0.7):
plshprof -output …\tracetest …\test.trc
MuniQSoft GmbH
DOAG 2009 PL/SQL Performance-Tuning
Seite 27
Danke für Ihre Aufmerksamkeit...
?
MuniQSoft GmbH
DOAG 2009 PL/SQL Performance-Tuning
Seite 28
Herunterladen