Oracle Performance Tuning

Grobübersicht Performance-Optimierung

시작하기. 무료입니다
또는 회원 가입 e메일 주소
Oracle Performance Tuning 저자: Mind Map: Oracle Performance Tuning

1. Optimizer

1.1. Regelbasiert (RBO)

1.1.1. verwendet vordefinierte Regeln

1.1.2. OPTIMIZER_MODE = RULE

1.1.3. Problem

1.1.3.1. Kann nur Inidizies einzelner Spalten verknüpfen

1.1.3.1.1. Hint INDEX_JOIN

1.1.3.2. Bevorzugt Indexe mit wenigen Spalten

1.1.3.3. Gibt es Indexe mit ähnlichen Spalten, wird der zuletzt erstellte verwendet

1.1.3.4. Unique und Primärschlüssel Indizies haben Vorrang

1.1.3.5. Reihenfolge der Spalten im Index wichtig

1.2. Kostenbasiert (CBO)

1.2.1. verwendet keine festen Regeln

1.2.2. ausgereifter

1.2.3. ermittelt Ausführungsplan anhand

1.2.3.1. Datenbankinformation

1.2.3.2. Tabellengrösse

1.2.3.3. Zeilenanzahl

1.2.3.4. Schlüsselverteilung

1.2.4. OPTIMIZER_MODE =

1.2.4.1. CHOOSE

1.2.4.1.1. Default bis 10g

1.2.4.1.2. Fallback zu RBO möglich, wenn keine Statistiken

1.2.4.2. FIRST_ROWS

1.2.4.2.1. bevorzugt Pläne die eine schnelle Rückgabe der ersten Zeilen ermöglicht

1.2.4.2.2. für OLTP-Datenbanken

1.2.4.3. ALL_ROWS

1.2.4.3.1. Maxmierung des Durchsatzes ermöglichen

1.2.4.3.2. Default für PL/SQL

1.2.4.3.3. für Batch-Verarbeitung/DWH

1.2.5. Statistik für mind. eine Tabelle liegt vor

2. Hints

2.1. Syntax

2.1.1. /*+ HintText */

2.1.2. Falsche Hint-Syntax wird ignoriert

2.2. NOLOGGING

2.3. ALL_ROWS

2.3.1. optimiert Zugriff auf eine Zeile

2.3.2. kann überschreiben

2.3.2.1. Nested Loop

2.3.2.2. SORT MERGE

2.3.2.3. HASH JOIN

2.4. AND_EQUAL

2.4.1. verknüpft Ein-Spalten-Index

2.4.2. nicht mehr als 5 erlaubt

2.5. APPEND

2.5.1. ermöglicht Direkten Zugriffspfad

2.5.2. Buffer Cache wird umgangen

2.5.3. Integritätsregeln werden ignoriert

2.5.4. Vorsicht!

2.5.4.1. nutzt den freigewordenen Speicherplatz von Delete-Statements nicht

2.5.4.2. wenn möglich TRUNCATE

2.6. CACHE(table)

2.6.1. Full-Table-Scan Blöcke an den Puffercache hängen

2.6.2. vorwiegend für kleine Tabellen verwenden

2.7. CURSOR_SHARING_EXACT

2.7.1. verhindert, das Literale in Bind-Variablen übersetzt werden

2.8. CHOOSE

2.8.1. verwendet CBO

2.8.1.1. wenn Statistiken existieren

2.9. FACT(table)

2.9.1. sagt CBO, dass es sich um eine FACT-Tabelle handelt

2.10. FIRST_ROWS(n)

2.10.1. Antwortzeit optimieren

2.10.2. bevorzugt

2.10.2.1. Index vor Full Table Scan

2.10.2.2. Nested Loop vor Sort/Merge Joins

2.10.2.3. wenn möglich Index für ORDER BY

2.11. FULL(table)

2.11.1. erzwingt Full Table Scan

2.12. HASH_AJ

2.12.1. wandelt Nested Loop in Hash Join bei Verwendung von NOT IN um

2.12.2. Einsatz in Unterabfrage

2.12.3. Verbesserte Performance

2.13. MERGE_AJ

2.13.1. wandelt Nested Loop in Merge Join bei NOT IN um

2.14. HASH_SJ

2.14.1. Antwortzeiten von EXISTS-Unterabfragen optimieren

2.14.2. Einschränkungen

2.14.2.1. Unterabfrage enthält nur eine Abfrage (Tabelle)

2.14.2.2. keine versachtelten Unterabfragen

2.14.2.3. Es dürfen nur Gleichheitsprädikate in der WHERE-Klausel vorhanden sein

2.14.2.4. in Unterabfrage kein

2.14.2.4.1. GROUP BY

2.14.2.4.2. CONNECT BY

2.14.2.4.3. ROWNUM

2.15. MERGE_SJ

2.15.1. ermittelt Zeilen der Unterabfrage nur einmal

2.16. NO_EXPAND

2.16.1. verhindert Aufsplittung der Abfrage

2.17. NO_FACT(table)

2.17.1. für CBO keine Fact-Tabelle

2.18. PARALLEL(table, integer, integer)

2.18.1. explizite Anzahl der Prozesse

2.19. PQ_DISTRIBUTE

2.19.1. Verbessern der Parallel Join Performance

2.20. PUSH_PRED(table)

2.20.1. verschiebt Join-Prädikat einer Tabelle in eine Inline-View

2.20.2. ermöglicht CBO bessere Entscheidungsfindung

2.21. PUSH_SUBQ

2.21.1. Erzwingt das Unterabfragen so früh wie möglich ausgewertet werden

2.21.2. EXISTS

2.22. STAR

2.22.1. erzwingt, dass die grösste Tabelle ans Ende gestellt wird

2.23. STAR_TRANSFORMATION

2.23.1. ähnlich STAR, CBO hat jedoch mehr Freiräume

2.24. UNNEST

2.24.1. Session muss gesetzt sein

2.24.1.1. UNEST_SUBQUERY = true

2.24.2. Platzierung in der Hauptabfrage

2.24.3. verküpft Rumpf der Unterabfrage mit der Hauptanweisung (NOT IN)

2.24.4. verbessert Optimizer-Entscheidung

2.25. USE_CONCAT

2.25.1. erzwingt Konvertierung von OR in UNION ALL

2.26. USE_HASH (table 1, table 2)

2.26.1. legt kleinste Tabelle in den Speicher, bevor die andere abgesucht wird

3. init.ora

3.1. tricky

3.2. pro Version gibt es neue Einstellungen bzw. fallen Bestehende weg

3.3. das setzen von undokumentieren Einstellungen vermeiden

3.4. COMPATIBLE auf die aktuelle Version, wenn möglich

3.5. Parameter

3.5.1. OPTIMIZER_INDEX_COST_ADJ

3.5.1.1. Werte

3.5.1.1.1. 100 - default

3.5.2. STAR_TRANSFORMATION_ENABLED

4. Mengenoperation

4.1. IN

4.1.1. innere Abfrage wird zuerst ausgeführt

4.1.2. Ist performanter wenn die innere Abfrage weniger Records enthält als die äussere

4.1.2.1. bevorzugter Einsatz bei OLTP

4.2. EXISTS

4.2.1. besser bei grösseren Datenbanken

5. Statistiken

5.1. ANALYZE

5.1.1. für Oracle <= 8i

5.1.2. COMPUTE STATISTICS

5.1.2.1. zeitintensiv

5.1.3. ESTIMATE STATISTICS SAMPLE 2 PERCENT

5.1.3.1. schneller

5.1.3.2. Genauigkeit bis zu 95%

5.2. DBMS_STATS

5.2.1. GATHER_SCHEMA_STATS

5.2.2. GATHER_DATABASE_STATS

5.2.2.1. Einsatz bei Ver >= 10

5.2.3. ermöglicht das Transferieren von Statistiken zwischen Servern

5.3. MONITORING

5.3.1. ALTER TABLE ... MONITORING/NOMONITORING

5.3.2. options => GATHER STALE

6. Ausführungsplan

6.1. auswerten mit

6.1.1. EXPLAIN PLAN

6.2. Beeinflussbar

7. Parallele Vearbeitung

7.1. alter session enable parallel dml;

7.2. Löschen beschleunigen, wenn TRUNCATE nicht verwendet werden kann

7.2.1. delete /*+ parallel(table,2) */ FROM tabel

8. Dynamic SQL

8.1. EXECUTE IMMEDIATE

8.1.1. BIND - Variablen nutzen

8.1.1.1. Zusätzlicher Schutz vor SQL-Injection

8.1.1.2. Hilfreich im OLTP-Bereich

9. Probleme

9.1. Anweisung ist nicht für Indexe ausgelegt

9.1.1. WHERE

9.1.1.1. SUBSTR

9.1.1.2. TRUNC

9.1.1.3. Verketten von Feldern

9.1.1.4. !=

9.1.1.5. Column + XXXX > XXXX

9.1.1.6. = NVL(XXX)

9.2. Fehlende oder ungeeignete Indizes

9.3. Einspalten-Index-Verknüpfung

9.4. Falsche Verwendung von

9.4.1. Nested Loop

9.4.1.1. Für OLTP die bessere Wahl

9.4.1.2. bei Berichtswesen und Batchläufen katastrophal

9.4.1.3. max. 10% der Zeilen einer Tabelle

9.4.2. Sort-Merge

9.4.2.1. funktioniert auch bei Abfragen mit Wertbereichen

9.4.2.2. ist nur schnell, wenn alle Spalten im WHERE indexiert sind

9.4.3. Hash-Join

9.4.3.1. legt Hash-Tabelle im Speicher an

9.4.3.1.1. kleinste Tabelle

9.4.3.2. vergleicht mit der Speicher-Tabelle

9.4.3.3. funktioniert nur mit = in der WHERE-Klausel

9.5. Falsche Verwendung von

9.5.1. IN

9.5.1.1. nur zu empfehlen, wenn das Ergebnis der Unterabfrage kleiner ist, als das der Hauptabfrage

9.5.2. EXISTS

9.5.2.1. häufig besser als IN

9.5.2.2. kann mit HINTS beschleunigt werden

9.5.3. NOT IN

9.5.4. NOT EXISTS

9.5.5. Tabellen-Joins

9.5.5.1. schneller als IN oder EXISTS

9.6. IF/ELSE

9.6.1. Decode verwenden

9.7. Unnötige Sortiervorgänge

9.7.1. CREATE INDEX

9.7.2. DISTINCT

9.7.3. GROUP BY

9.7.4. ORDER BY

9.7.5. INTERSECT

9.7.6. MINUS

9.7.7. UNIONS

9.7.8. UNINDEXED TABLE JOINS

9.8. zuviele Indizes

9.8.1. negativ bei

9.8.1.1. Batchprozessen

9.8.1.2. Löschvorgängen

9.9. OR statt UNION

9.10. verschachtelte Views

9.10.1. verhindert Optimierung

9.11. Verknüpfen zu vieler Tabellen

9.11.1. verhindert Optimierung

9.11.2. verleidet zu Datenbanken mit unnormalisierten Daten

10. Analyse

10.1. v$sql

10.2. v$session_longops

10.3. v$sql_plan

10.3.1. Ausführungspläne in der Vergangenheit

10.4. Wait-Events

10.4.1. v$session_wait

10.4.2. v$session_event

10.4.3. v$system_event

10.5. ALTER TABLE ... MONITORING

10.6. Real Application Testing Tool

10.6.1. für komplette Applikation

10.7. OPTIMIZER_USE_PENDING_STATISTICS

10.8. EXPLAIN PLAN

10.8.1. DBMS_XPLAN

10.9. DBMS_MONITOR

10.10. DBMS_ADVISOR

10.11. SQL_TRACE

10.11.1. Aktivierung in init.ora vermeiden

10.11.2. TKPROF

10.11.2.1. Tracefile formatieren

10.12. DBMS_PROFILER

10.12.1. für PL/SQL

10.13. DBMS_HPROF

11. Delta Processing

11.1. MINUS

11.2. MERGE

11.3. OUTER JOIN

11.4. Tabellen partitionieren

11.4.1. Verbesserung für

11.4.1.1. Delta-Ladung

11.4.1.2. Abfragen

12. Analytische Funktionen

12.1. bevorzugen vor

12.1.1. GROUP BY

12.1.2. Subselect-Update

12.1.3. Subselect-Kalkualtionen

12.2. OVER (PARTION BY... ORDER BY)

12.3. OVER (ORDER BY..)

12.4. LAG(Spalte, rows, Defautwert)

12.5. LEAD

13. Materialiserte Views

13.1. bei Abfragen mit mehr als 5 Joins