Freitag, Juni 24, 2011

Troubleshooting Oracle Performance von Christian Antognini

Über Christian Antogninis Troubleshooting Oracle Performance wollte ich schon seit längerer Zeit etwas schreiben, bin aber nie dazu gekommen. Das war insofern unpassend, als das Buch aus meiner Sicht eines der besten überhaupt zum Thema "Performance Tuning in Oracle" ist. Der Herr Antognini ist seit vielen Jahren bei Trivadis tätig und er ist ein Mitglied der Tafelrunde der OakTable. Außerdem war er einer der Technical Reviewers für Jonathan Lewis' Cost Based Oracle, was allein schon ein starkes Indiz dafür ist, dass man wohl kaum jemanden finden wird, der in diesem Gebiet umfassendere Kentnisse besitzt. Troubleshooting Oracle Performance ist 2008 bei Apress erschienen, und bisher waren alle Oracle-Bücher von Apress, die ich gelesen habe, ausgesprochen lesenswert. Zu den Technical Reviewers des Bandes gehören neben Urs Meier (ebenfalls Trivadis) und Francesco Renne auch Alberto Dell'Era und Joze Senegacnik, von denen ich schon sehr viele gute Blog-Artikel und Präsentationen gesehen habe. Laut Apress-Homepage richtet sich das Buch an folgende Zielgruppe: "For application developers and database administrators involved in troubleshooting performance problems of Oracle-based applications" auf einem Level "Beginner to Advanced".

Troubleshooting Oracle Performance gliedert sich in fünf Abschnitte, die wiederum in Einzelkapitel unterteilt sind:
  1. 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.
  2. 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 ...).
  3. 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.
  4. 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
      sind.Wie alle Daumenregeln ist das natürlich abhängig von den Rahmenbedingungen. Weitere wichtige Hinweise betreffen den Einfluß der Read Consistency (Block Rekonstruktion) und den Prefetching (Arraysize in sqlplus) auf die Anzahl der LIOs. Es folgen umfangreiche Erläuterungen zur Partitionierung, zur Indizierung (B*Tree, Bitmap), zu IOTs (Hinweis: IOT mit Overflow ist eigentlich sinnfrei) und zum Single-Table Hash Cluster (der für Lookup-Tables mit Key-Zugriff ideal ist).
    • 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
      was durchaus einleuchtet, wenn man sich die innere Logik der Verfahren bewußt macht. Außerdem werden noch diverse interne Transformationen inklusive der Star Transformation erläutert (deren Logik ich hier sehr schön erklärt fand.
    • 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
    Wer dieses Buch als "Beginner" komplett liest und versteht, ist vermutlich kein "Beginner" mehr, sondern dann schon ziemlich "Advanced". Eine ähnlich fundierte und kompakte Darstellung zum Thema Oracle-Performance habe ich bisher noch nicht gesehen. Die einzigen kleineren Schwächen sehe ich in einigen Strukturentscheidungen, die dazu führen, dass einige Kapitel (vor allem am Anfang des Buches) nicht ganz homogen wirken. Außerdem werden manche Punkte an mehreren Stellen im Buch wiederholt, was aber durchaus auch als Vertiefung verstanden werden kann. Zu Beginn entschuldigt sich der Autor für sein Englisch, das tatsächlich an ein paar Stellen etwas holprig wirkt - aber ich bin der Letzte, der da aus seinem Glashaus heraus Steine werfen sollte. Insgesamt für mich ein großartiges Buch, das bei mir meistens irgendwo in der Nähe meines Arbeitsplatzes herumliegt.

      Keine Kommentare:

      Kommentar veröffentlichen

      Kommentar veröffentlichen