Troubleshooting Oracle Performance gliedert sich in fünf Abschnitte, die wiederum in Einzelkapitel unterteilt sind:
- Foundations:
- in Kapitel 1 wird erläutert, wie man mit Performance-Fragestellungen grundsätzlich umgehen sollte - also z.B., dass Performance schon bei der Requirement Analyse und beim Design berücksichtigt werden muss - und nicht erst nach dem Rollout; welche Rolle automatisierte Tests spielen; dass man von den Wahrnehmungen der Anwender (und den Einzelzugriffen) und nicht von System-Ratios ausgehen sollte etc.
- Kapitel 2 führt diverse "Key Concepts" ein, die für die Performance relevant sind: Selectivity + Cardinality, Cursor, Parsing, Bind Variables. Besonders die Erläuterungen zu Cursors und Parsing fand ich sehr prägnant - hier helfen die auch an anderen Stellen verwendeten Flußdiagramme, um komplexe Zusammenhänge und Abläufe zu erklären.
- Identification:
- Kapitel 3 trägt den Titel "Identifying Performance Problems" und erläutert recht ausführlich, auf welchen Ebenen Probleme auftreten können (Applikation, Netzwerk, Datenbank etc.) und wie man sie analysieren kann. Sehr umfangreich (S. 59 - 106) und erhellend sind dabei die Erläuterungen zum SQL_TRACE (10046) und zur Formatierung der Trace-Files über TKPROF und Antogninis eigenes TVD$XTAT-Tool (dessen einziges Manko der unhandliche Name ist ...).
- Query Optimizer:
- Kapitel 4 "System and Object Statistics" finde ich besonders gelungen. Es beginnt mit den System Statistics (Noworkload, Workload), erläutert Object- und Columns-Statsitics und liefert eine sehr verständliche Erklärung zu Histogrammen (und Oracles Namensgebung in diesem Bereich). Darüber hinaus werden auch Spezialthemen wie Extended Statistics (zur Beschreibung von Korrelationen über mehrere Spalten) angesprochen. Es folgen umfangreiche Hinweise zum sinnvollen Einsatz von dbms_stats und zur Gestaltung einer effektiven Statistkerfassungsstrategie (ein Thema, das mir dieser Tage gerade besonders relevant erscheint).
- Kapitel 5 "Configuring the Query Optimizer" beschäftigt sich mit diversen Instanz-Parametern, die das Verhalten des cbo beeinflussen (optimizer_feature_enabled, db_file_multiblock_read_count, optimizer_dynamic_sampling, optimizer_index_caching und optimizer_index_cost_adj etc.) und mit den unterschiedlichen Optionen zum PGA-Management.
- Optimization:
- Kapitel 6 "Execution Plans" ist vielleicht das wichtigste Kapitel im Buch: ich habe noch keine bessere Einführung in die Interpretation von Zugriffsplänen gelesen. Zunächst werden diverse Hilfsmittel vorgestellt (v$-Views, dbms_xplan, 10053er Trace), dann folgt eine umfangreiche Darstellung "Interpreting Execution Plans" (S. 221-245), die sich mit den Operationstypen und ihrer Repräsentation in den Plänen beschäftigt. In späteren Kapiteln (9, 10) wird die Arbeitsweise der einzelnen Operation dann noch ausführlicher erläutert.
- Kapitel 7 "SQL Tuning Techniques" beschäftigt sich mit den unterschiedlichen Möglichkeiten der SQL-Optimierung und ihren jeweiligen Vor- und Nachteilen: Änderung von physikalischen Strukturen (Indizes), Umformulierung von Queries, Verwendung von Hints, Änderungen des Execution Environment, Anlage von SQL Profiles, Outlines, Baselines. Besonders hilfreich sind die Abschnitte "When to use it" und "Pitfalls and Fallacies".
- Kapitel 8 "Optimizations" beschäftigt sich sehr intensiv mit dem Parsing. Hier fand ich die Reihenfolge der Darstellung nicht ganz einleuchtend, weil die Code-Beispiele zum Verhalten und zur Verhaltensänderungen erst ganz am Schluss erscheinen. Allerdings ist Parsing auch nicht unbedingt mein Thema (da ich kein OLTP-System betreue).
- Kapitel 9 "Optimizing Data Access" hat mir wieder sehr gut gefallen. Hier wird erläutert, wie man ineffektive Zugriffe bestimmen kann. Unter anderem erscheint die Daumenregel, dass:
- 5 LIOs pro Row gut
- 10-15 LIOs pro Row ok
- mehr als 20 LIOs pro Row zu viel
- Kapitel 10 "Optimizing Joins" ist ebenfalls hochinteressant und erläutert zunächst unterschiedliche Join Trees (Left-Deep, Reght-Deep, Zig-zag, Bushy Trees - was ich bisher noch nirgendwo in systematischer Darstellung gesehen hatte), die verschiedenen Join Typen (Cross, Theta, Equi, Self, Outer, Semi, Anti) und die verschiedenen Abarbeitungsstrategien: Nested Loops, Hash Join, Merge Join, die hier sehr anschaulich erklärt und umfassend dargestellt werden. Interessant fand ich den (meinen Beobachtungen entsprechenden) Hinweis, dass Merge Joins nicht häufig verwendet werden, das NL und Hash Join in der Regel effizienter sind - sie erscheinen üblicherweise nur dann, wenn die anderen Methoden nicht verwendet werden können (Hash Joins unterstützen keine Cross, Theta und Partitioned Outer Joins). Wichtig ist auch die Erläuterung dazu, wann die unterschiedlichen Methoden erste Ergebnisse liefern können:
- NL: unmittelbar
- Merge Join: erst nach Abschluss des Sortierens beider Input-Mengen
- Hash Join: nach Abschluss des Aufbaus der Hash Table
- Kapitel 11 "Beyond Data Access and Join Optimization" erläutert (sehr detailliert) die Verwendung von Materialized Views und von Parallelisierung - also klassischen DWH/DSS-Features.
- Kapitel 12 "Optimizing the Physical Design" beschäftigt sich mit der Wahl von Datentypen, mit Row Migration und Row Chaining, Contention und Compression.
- Appendixes: mit einem Verzeichnis der download-baren Dateien und einer Literaturliste
Keine Kommentare:
Kommentar veröffentlichen