
1. Hints
1.1. Syntax
1.1.1. /*+ HintText */
1.1.2. Falsche Hint-Syntax wird ignoriert
1.2. NOLOGGING
1.3. ALL_ROWS
1.3.1. optimiert Zugriff auf eine Zeile
1.3.2. kann überschreiben
1.3.2.1. Nested Loop
1.3.2.2. SORT MERGE
1.3.2.3. HASH JOIN
1.4. AND_EQUAL
1.4.1. verknüpft Ein-Spalten-Index
1.4.2. nicht mehr als 5 erlaubt
1.5. APPEND
1.5.1. ermöglicht Direkten Zugriffspfad
1.5.2. Buffer Cache wird umgangen
1.5.3. Integritätsregeln werden ignoriert
1.5.4. Vorsicht!
1.5.4.1. nutzt den freigewordenen Speicherplatz von Delete-Statements nicht
1.5.4.2. wenn möglich TRUNCATE
1.6. CACHE(table)
1.6.1. Full-Table-Scan Blöcke an den Puffercache hängen
1.6.2. vorwiegend für kleine Tabellen verwenden
1.7. CURSOR_SHARING_EXACT
1.7.1. verhindert, das Literale in Bind-Variablen übersetzt werden
1.8. CHOOSE
1.8.1. verwendet CBO
1.8.1.1. wenn Statistiken existieren
1.9. FACT(table)
1.9.1. sagt CBO, dass es sich um eine FACT-Tabelle handelt
1.10. FIRST_ROWS(n)
1.10.1. Antwortzeit optimieren
1.10.2. bevorzugt
1.10.2.1. Index vor Full Table Scan
1.10.2.2. Nested Loop vor Sort/Merge Joins
1.10.2.3. wenn möglich Index für ORDER BY
1.11. FULL(table)
1.11.1. erzwingt Full Table Scan
1.12. HASH_AJ
1.12.1. wandelt Nested Loop in Hash Join bei Verwendung von NOT IN um
1.12.2. Einsatz in Unterabfrage
1.12.3. Verbesserte Performance
1.13. MERGE_AJ
1.13.1. wandelt Nested Loop in Merge Join bei NOT IN um
1.14. HASH_SJ
1.14.1. Antwortzeiten von EXISTS-Unterabfragen optimieren
1.14.2. Einschränkungen
1.14.2.1. Unterabfrage enthält nur eine Abfrage (Tabelle)
1.14.2.2. keine versachtelten Unterabfragen
1.14.2.3. Es dürfen nur Gleichheitsprädikate in der WHERE-Klausel vorhanden sein
1.14.2.4. in Unterabfrage kein
1.14.2.4.1. GROUP BY
1.14.2.4.2. CONNECT BY
1.14.2.4.3. ROWNUM
1.15. MERGE_SJ
1.15.1. ermittelt Zeilen der Unterabfrage nur einmal
1.16. NO_EXPAND
1.16.1. verhindert Aufsplittung der Abfrage
1.17. NO_FACT(table)
1.17.1. für CBO keine Fact-Tabelle
1.18. PARALLEL(table, integer, integer)
1.18.1. explizite Anzahl der Prozesse
1.19. PQ_DISTRIBUTE
1.19.1. Verbessern der Parallel Join Performance
1.20. PUSH_PRED(table)
1.20.1. verschiebt Join-Prädikat einer Tabelle in eine Inline-View
1.20.2. ermöglicht CBO bessere Entscheidungsfindung
1.21. PUSH_SUBQ
1.21.1. Erzwingt das Unterabfragen so früh wie möglich ausgewertet werden
1.21.2. EXISTS
1.22. STAR
1.22.1. erzwingt, dass die grösste Tabelle ans Ende gestellt wird
1.23. STAR_TRANSFORMATION
1.23.1. ähnlich STAR, CBO hat jedoch mehr Freiräume
1.24. UNNEST
1.24.1. Session muss gesetzt sein
1.24.1.1. UNEST_SUBQUERY = true
1.24.2. Platzierung in der Hauptabfrage
1.24.3. verküpft Rumpf der Unterabfrage mit der Hauptanweisung (NOT IN)
1.24.4. verbessert Optimizer-Entscheidung
1.25. USE_CONCAT
1.25.1. erzwingt Konvertierung von OR in UNION ALL
1.26. USE_HASH (table 1, table 2)
1.26.1. legt kleinste Tabelle in den Speicher, bevor die andere abgesucht wird
2. Mengenoperation
2.1. IN
2.1.1. innere Abfrage wird zuerst ausgeführt
2.1.2. Ist performanter wenn die innere Abfrage weniger Records enthält als die äussere
2.1.2.1. bevorzugter Einsatz bei OLTP
2.2. EXISTS
2.2.1. besser bei grösseren Datenbanken
3. Ausführungsplan
3.1. auswerten mit
3.1.1. EXPLAIN PLAN
3.2. Beeinflussbar
4. Parallele Vearbeitung
4.1. alter session enable parallel dml;
4.2. Löschen beschleunigen, wenn TRUNCATE nicht verwendet werden kann
4.2.1. delete /*+ parallel(table,2) */ FROM tabel
5. Dynamic SQL
5.1. EXECUTE IMMEDIATE
5.1.1. BIND - Variablen nutzen
5.1.1.1. Zusätzlicher Schutz vor SQL-Injection
5.1.1.2. Hilfreich im OLTP-Bereich
6. Delta Processing
6.1. MINUS
6.2. MERGE
6.3. OUTER JOIN
6.4. Tabellen partitionieren
6.4.1. Verbesserung für
6.4.1.1. Delta-Ladung
6.4.1.2. Abfragen
7. Analytische Funktionen
7.1. bevorzugen vor
7.1.1. GROUP BY
7.1.2. Subselect-Update
7.1.3. Subselect-Kalkualtionen
7.2. OVER (PARTION BY... ORDER BY)
7.3. OVER (ORDER BY..)
7.4. LAG(Spalte, rows, Defautwert)
7.5. LEAD
8. Materialiserte Views
8.1. bei Abfragen mit mehr als 5 Joins
9. Optimizer
9.1. Regelbasiert (RBO)
9.1.1. verwendet vordefinierte Regeln
9.1.2. OPTIMIZER_MODE = RULE
9.1.3. Problem
9.1.3.1. Kann nur Inidizies einzelner Spalten verknüpfen
9.1.3.1.1. Hint INDEX_JOIN
9.1.3.2. Bevorzugt Indexe mit wenigen Spalten
9.1.3.3. Gibt es Indexe mit ähnlichen Spalten, wird der zuletzt erstellte verwendet
9.1.3.4. Unique und Primärschlüssel Indizies haben Vorrang
9.1.3.5. Reihenfolge der Spalten im Index wichtig
9.2. Kostenbasiert (CBO)
9.2.1. verwendet keine festen Regeln
9.2.2. ausgereifter
9.2.3. ermittelt Ausführungsplan anhand
9.2.3.1. Datenbankinformation
9.2.3.2. Tabellengrösse
9.2.3.3. Zeilenanzahl
9.2.3.4. Schlüsselverteilung
9.2.4. OPTIMIZER_MODE =
9.2.4.1. CHOOSE
9.2.4.1.1. Default bis 10g
9.2.4.1.2. Fallback zu RBO möglich, wenn keine Statistiken
9.2.4.2. FIRST_ROWS
9.2.4.2.1. bevorzugt Pläne die eine schnelle Rückgabe der ersten Zeilen ermöglicht
9.2.4.2.2. für OLTP-Datenbanken
9.2.4.3. ALL_ROWS
9.2.4.3.1. Maxmierung des Durchsatzes ermöglichen
9.2.4.3.2. Default für PL/SQL
9.2.4.3.3. für Batch-Verarbeitung/DWH
9.2.5. Statistik für mind. eine Tabelle liegt vor
10. init.ora
10.1. tricky
10.2. pro Version gibt es neue Einstellungen bzw. fallen Bestehende weg
10.3. das setzen von undokumentieren Einstellungen vermeiden
10.4. COMPATIBLE auf die aktuelle Version, wenn möglich
10.5. Parameter
10.5.1. OPTIMIZER_INDEX_COST_ADJ
10.5.1.1. Werte
10.5.1.1.1. 100 - default
10.5.2. STAR_TRANSFORMATION_ENABLED
11. Statistiken
11.1. ANALYZE
11.1.1. für Oracle <= 8i
11.1.2. COMPUTE STATISTICS
11.1.2.1. zeitintensiv
11.1.3. ESTIMATE STATISTICS SAMPLE 2 PERCENT
11.1.3.1. schneller
11.1.3.2. Genauigkeit bis zu 95%
11.2. DBMS_STATS
11.2.1. GATHER_SCHEMA_STATS
11.2.2. GATHER_DATABASE_STATS
11.2.2.1. Einsatz bei Ver >= 10
11.2.3. ermöglicht das Transferieren von Statistiken zwischen Servern
11.3. MONITORING
11.3.1. ALTER TABLE ... MONITORING/NOMONITORING
11.3.2. options => GATHER STALE
12. Probleme
12.1. Anweisung ist nicht für Indexe ausgelegt
12.1.1. WHERE
12.1.1.1. SUBSTR
12.1.1.2. TRUNC
12.1.1.3. Verketten von Feldern
12.1.1.4. !=
12.1.1.5. Column + XXXX > XXXX
12.1.1.6. = NVL(XXX)
12.2. Fehlende oder ungeeignete Indizes
12.3. Einspalten-Index-Verknüpfung
12.4. Falsche Verwendung von
12.4.1. Nested Loop
12.4.1.1. Für OLTP die bessere Wahl
12.4.1.2. bei Berichtswesen und Batchläufen katastrophal
12.4.1.3. max. 10% der Zeilen einer Tabelle
12.4.2. Sort-Merge
12.4.2.1. funktioniert auch bei Abfragen mit Wertbereichen
12.4.2.2. ist nur schnell, wenn alle Spalten im WHERE indexiert sind
12.4.3. Hash-Join
12.4.3.1. legt Hash-Tabelle im Speicher an
12.4.3.1.1. kleinste Tabelle
12.4.3.2. vergleicht mit der Speicher-Tabelle
12.4.3.3. funktioniert nur mit = in der WHERE-Klausel
12.5. Falsche Verwendung von
12.5.1. IN
12.5.1.1. nur zu empfehlen, wenn das Ergebnis der Unterabfrage kleiner ist, als das der Hauptabfrage
12.5.2. EXISTS
12.5.2.1. häufig besser als IN
12.5.2.2. kann mit HINTS beschleunigt werden
12.5.3. NOT IN
12.5.4. NOT EXISTS
12.5.5. Tabellen-Joins
12.5.5.1. schneller als IN oder EXISTS
12.6. IF/ELSE
12.6.1. Decode verwenden
12.7. Unnötige Sortiervorgänge
12.7.1. CREATE INDEX
12.7.2. DISTINCT
12.7.3. GROUP BY
12.7.4. ORDER BY
12.7.5. INTERSECT
12.7.6. MINUS
12.7.7. UNIONS
12.7.8. UNINDEXED TABLE JOINS
12.8. zuviele Indizes
12.8.1. negativ bei
12.8.1.1. Batchprozessen
12.8.1.2. Löschvorgängen
12.9. OR statt UNION
12.10. verschachtelte Views
12.10.1. verhindert Optimierung
12.11. Verknüpfen zu vieler Tabellen
12.11.1. verhindert Optimierung
12.11.2. verleidet zu Datenbanken mit unnormalisierten Daten
13. Analyse
13.1. v$sql
13.2. v$session_longops
13.3. v$sql_plan
13.3.1. Ausführungspläne in der Vergangenheit
13.4. Wait-Events
13.4.1. v$session_wait
13.4.2. v$session_event
13.4.3. v$system_event
13.5. ALTER TABLE ... MONITORING
13.6. Real Application Testing Tool
13.6.1. für komplette Applikation
13.7. OPTIMIZER_USE_PENDING_STATISTICS
13.8. EXPLAIN PLAN
13.8.1. DBMS_XPLAN
13.9. DBMS_MONITOR
13.10. DBMS_ADVISOR
13.11. SQL_TRACE
13.11.1. Aktivierung in init.ora vermeiden
13.11.2. TKPROF
13.11.2.1. Tracefile formatieren
13.12. DBMS_PROFILER
13.12.1. für PL/SQL