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