SQL Performance Analyse und Optimierung auf Db2 for i

Daten sind unser wichtigstes Gut. Daten wachsen exponentiell. Die Beziehungen zwischen Daten werden immer komplexer und die Zugriffe auf die Daten immer vielschichtiger.

Je schneller die Zugriffe auf die Daten erfolgen können, desto schneller erhält man das Ergebnis, desto besser kann man die Daten auswerten, desto besser sind die Entscheidungen des Managements und desto besser kann man sich Wettbewerbsvorteile sichern.

Die Zugriffe erfolgen heute fast ausschließlich mit SQL!

Das Schöne wiederum an SQL ist, dass die gewünschten Daten gefunden werden! Allerdings macht es einen riesigen Unterschied, ob auf einen Datensatz direkt zugegriffen werden kann, oder ob die ganze Tabelle durchgelesen werden muss, um eben diesen Satz zu finden.

Deshalb wird die SQL-Performance Analyse und Optimierung immer wichtiger!

Zwei Hauptfaktoren beeinflussen die Performance ihrer SQL-Abfragen:

  • SQL-Syntax – Der Schlüssel zur Effizienz Bereits kleine Unterschiede in der SQL-Syntax können große Auswirkungen haben:
    • Zwei Abfragen liefern das gleiche Ergebnis, nur in einem Fall kann ein Index verwendet werden, während im anderen Fall die komplette Tabelle durchgelesen werden muss.
    • Oder in einem anderen Fall mussten in ein und derselben Abfrage mehrere Tabellen verknüpft werden und einzelne Daten, sowie aggregierte Daten (Summen, Durchschnitt) ermittelt werden. Anstatt jede Tabelle nur einmal zu verarbeiten, wurde auf die gleiche Tabelle mehrfach zugegriffen. Nach der Überarbeitung wurde auf die Tabelle nur noch einmal zugegriffen, wodurch die Abfrage nur noch 1/3 der Laufzeit benötigt hat.
  • Zugriffswege (Indices) – Der Weg zur optimalen Abfrage Bei der Optimierung werden die vorhandenen Zugriffswege (Indices, logische Dateien, Key Constraints) bewertet. Sofern keine Zugriffswege vorhanden sind wird die komplette Tabelle gelesen. Das Gleiche gilt, wenn keine geeigneten Zugriffswege vorhanden sind. Temporäre Indices (MTI = Maintained Temporary Index) werden nur in Ausnahmefällen, wenn die Abfrage ansonsten nicht ausführbar wäre, erstellt. Die (optimalen) Zugriffswege werden nach bestimmten Algorithmen ermittelt. Sofern die „besten“ Indices nicht vorhanden sind, wird eine Index-Empfehlung (Index-Advice) erstellt. Diese Empfehlungen können ausgewertet und daraufhin Indices gezielt erstellt werden. Einfach alle vorgeschlagenen Indices zu erstellen ist keine gute Idee, da jeder (zusätzliche) Index beim Hinzufügen, Ändern und Löschen von Datensätzen n der zugrunde liegenden Tabelle Performance kostet. Je größer die Tabellen und je mehr Zugriffswege auf der Tabelle liegen, desto langsamer wird das Hinzufügen, Ändern und Löschen von Datensätzen. Index-Empfehlungen werden nur für „reguläre“ Indices erstellt. Indices, die von den erweiterten Index-Technologien (Derived- and Sparse-Indexe) profitieren können, werden nicht vorgeschlagen. Hier hilft nur die Erfahrung. Ohne passende Indices muss eine Tabelle vollständig gelesen werden – was massiv Zeit kostet. Die Optimierung basiert auf:
    • Analyse der vorhandenen Zugriffswege (Indices, logische Dateien, Key Constraints)
    • Bewertung der vorgeschlagenen Indices (Index Advice) auch in Verbindung mit den Statements durch die die Advices generiert wurden
    • Konvertierung der temporären Indices (MTI = Maintained Temporary Index) in permanente Indices
    • Gezielte Erstellung der notwendigen Indices incl. derived Indices (generierte Schlüsselfelder) und sparse Indices (WHERE-Bedingungen) sowie Encoded Vector Indices (EVI) mit und ohne Include-Anweisungen
    • Löschung ungenutzte Indices Achtung: Jeder zusätzliche Indes kostet Performance bei INSERT-, UPDATE- und DELETE-Operationen. Eine pauschale Erstellung aller vorgeschlagenen Zugriffswege ist daher kontraproduktiv.