SQL-Server-Performance Tuning-Tipps

Das Tuning oder die Feineinstellung von Abfragen, das sogenannte Query-Tuning, ist häufig der schnellste Weg, um die Performance des SQL-Servers zu optimieren. In den meisten Fällen sind Verbesserungsmaßnahmen der Server-Performance auf Systemebene (Arbeitsspeicher, Prozessoren usw.) selten sinnvoll und vor allem teuer. Erfahrene Entwickler sind der Meinung, dass sich die meisten Performance-Probleme auf schlecht geschriebene Abfragen und ineffiziente Indizierung zurückführen lassen und nicht etwa auf Hardwarebeschränkungen. So lassen sich einige Performance-Probleme tatsächlich nur durch die Feineinstellung der Abfragen beheben.

Wenn es jedoch an das SQL-Server Query-Tuning geht, wissen DBAs häufig gar nicht, wo sie ansetzen sollen. Wie kann man eine Abfrage bewerten? Wie findet man die Mängel in der Schreibweise der Abfrage? Wie lassen sich Verbesserungsmöglichkeiten aufdecken? Die Feineinstellung von Abfragen ist zur Hälfte Technik und zur Hälfte Kunst, denn es gibt keine richtigen und keine falschen Antworten, sondern nur die am besten geeignete Lösung im jeweiligen Fall.

Die SQL-Server Abfragen-Einstellung lässt sich in drei übergeordnete Schritte einteilen:

  1. Standard-Analyse der Abfrage
  2. Erweiterte Analyse der Abfragen
  3. Einsatz eines DB-Leistungsüberwachungs-Tools zur Abfragen-Einstellung

Es folgen zwölf kurze Tipps dazu, wie ein DBA die Abfrageleistung nachweislich verbessern kann und gleichzeitig Gewissheit erhält, dass die jeweilige Änderung die Geschwindigkeit der Abfrage, die SQL-Server-Performance, tatsächlich erhöht hat.

1. Standard-Analyse der Abfrage

DBAs benötigen Einsicht in alle Ebenen und alle Daten über aufwändige Abfragen, um die Ursache einer schwachen SQL-Server-Performance ausfindig zu machen und dieser durch Optimierung entgegenwirken zu können. Eine effektive Feineinstellung erfordert einen Einblick in

  • die obersten SQL-Anweisungen,
  • die obersten Warteformen,
  • SQL-Pläne,
  • geblockte Abfragen,
  • Ressourcenkonflikte und
  • die Auswirkungen von fehlenden Indexen.

Fangen Sie mit den Grundlagen in Sachen Test und SQL-Server-Performance-Tuning an: Ein genauer Überblick über die Gegebenheiten ist hilfreich, bevor Sie sich vertiefen.

Tipp 1: Kennen Sie Ihre Tabellen und Zeilenanzahl
Überprüfen Sie zunächst, ob Sie tatsächlich in einer Tabelle arbeiten – nicht in einer Ansicht oder in einer Tabellenwertfunktion. Tabellenwertfunktionen bringen ihre eigenen Leistungsansprüche mit sich. Sehen Sie sich mit SSMS die Abfrageelemente an, um Details zu erkennen. Überprüfen Sie die Zeilenanzahl durch Abfrage der DMVs.

Tipp 2: Untersuchen Sie die Abfragefilter, WHERE- und JOIN-Segmente und achten Sie auf die gefilterte Zeilenanzahl
Wenn keine Filter vorliegen und die Mehrheit der Tabelle ausgegeben wird, fragen Sie sich, ob alle Daten wirklich benötigt werden. Wenn es überhaupt keine Filter gibt, ist dies möglicherweise ein Signal, das näher untersucht werden sollte, denn es kann Abfragen stark verlangsamen.

Tipp 3: Kennen Sie die Selektivität Ihrer Tabellen
Vergewissern Sie sich anhand der Tabellen und Filter aus den beiden vorhergehenden Tipps, mit wie vielen Zeilen Sie arbeiten und fragen Sie nach der Größe des eigentlichen logischen Datensatzes. Wir empfehlen den Einsatz von SQL-Diagrammen als hilfreiches Mittel zur Einschätzung der Abfragen und der Abfrage-Selektivität.

Tipp 4: Analysieren Sie die zusätzlichen Abfrage-Spalten
Untersuchen Sie genau die SELECT * oder Skalar-Funktionen, um zu erkennen, ob weitere Spalten dazugehören. Je mehr Spalten ausgegeben werden, desto schwieriger wird es möglicherweise für den Ausführungsplan, bestimmte Index-Operationen einzusetzen, was wiederum einen Abfall der SQL-Server-Performance bewirken kann.

2. Erweiterte Analyse der Abfragen

Und weiter geht es in Sachen Analyse im Vorfeld einer Performance-Optimierung:

Tipp 5: Sich der Beschränkungen bewusst zu sein und diese einzusetzen, ist nützlich
Bei der Feineinstellung kann es hilfreich sein, die Beschränkungen zu kennen und bewusst einzusetzen. Überprüfen Sie die vorhandenen Schlüssel, Beschränkungen und Indexe, um sicherzugehen, dass Sie keine unnötigen Maßnahmen ergreifen, und um sicherzustellen, dass die Indexe sich nicht mit bereits vorhandenen überschneiden.

Um Informationen über Indexe zu erhalten, führen Sie das gespeicherte Verfahren sp_helpindex aus:

 

Tipp 6: Überprüfen Sie den tatsächlichen (nicht den geschätzten) Plan
Geschätzte Pläne basieren auf statistischen Schätzungen, um die geschätzten Zeilen zu ermitteln. Tatsächliche Pläne verwenden tatsächliche Statistiken aus der Laufzeit. Bei Unterschieden zwischen den tatsächlichen und den geschätzten Plänen sollten Sie weitere Untersuchungen vornehmen.

Tipp 7: Zeichnen Sie die Ergebnisse auf, mit Schwerpunkt auf der Anzahl der logischen I/Os
Wenn Sie die Ergebnisse nicht kennen, werden Sie die wahren Auswirkungen der Änderungen nicht erkennen können.

Tipp 8: Passen Sie die Abfrage an Ihre Erkenntnisse an und nehmen Sie jeweils kleine, einzelne Änderungen vor 
Zu viele Änderungen auf einmal sind mitunter nicht sinnvoll, da sie sich gegenseitig aufheben! Suchen Sie zu Beginn nach den aufwändigsten Operationen. Es gibt keine richtigen oder falschen Antworten, nur die jeweils passende Lösung.

Tipp 9: Führen Sie die Abfrage erneut durch und zeichnen Sie die Ergebnisse aufgrund Ihrer Änderung auf  
Wenn Sie in den logischen I/Os eine Verbesserung bemerken, die jedoch noch nicht ausreicht, gehen Sie zurück zu Tipp 8, um andere Faktoren zu untersuchen, die möglicherweise angepasst werden müssen. Nehmen Sie weiterhin nur je eine Änderung vor, führen Sie die Abfrage erneut durch und vergleichen Sie die Ergebnisse, bis Sie auf alle aufwändigen Operationen eingegangen sind und mit dem Ergebnis zufrieden sind.

Tipp 10: Wenn Sie weitere Verbesserungen anstreben, erwägen Sie die Anpassung der Indexe, um die logischen I/O zu reduzieren 
Mehr Indexe hinzuzufügen oder diese anzupassen, mag nicht immer optimal sein, ist jedoch oft die einzige Option, wenn Sie den Code nicht ändern können. Verbesserungen lassen sich möglicherweise über vorhandene Indexe, einen Gesamtindex und einen gefilterten Index erzielen.

Tipp 11: Führen Sie die Abfrage erneut durch und zeichnen Sie die Ergebnisse auf
Wenn Sie Anpassungen vorgenommen haben, führen Sie die Abfrage erneut durch und zeichnen Sie erneut die Ergebnisse auf.

Tipp 12: Beseitigen Sie Unnötiges
Halten Sie Ausschau nach häufig anzutreffenden Leistungshemmern wie: Code-first-Generatoren, Missbrauch von Platzhaltern, Skalar-Funktionen, verschachtelte Ansichten, Cursors und zeilenweise Verarbeitung.

3. Einsatz eines DB-Leistungsüberwachungs-Tools zur Abfragen-Einstellung

Herkömmliche Datenbanküberwachungs-Tools setzen den Schwerpunkt auf diagnostische Werte. Aktuelle Verwaltungs-Tools für die Anwendungsleistung liefern Hinweise, können aber nicht zur Ursache führen.

Tipp: 
Vereinfachen Sie die Abfragen-Feineinstellung durch den Einsatz einer kontinuierlichen SQL-Server-Performance-Monitoring-Lösung der Datenbankleistung wie SolarWinds® Database Performance Analyzer (DPA), mit der die Leistungsdaten in einer zentralen Oberfläche zusammengefasst werden. Mit DPA können Sie:

  • die spezifische Abfrage erkennen, die verzögert ist.
  • den spezifischen Engpass (Ereignis abwarten) erkennen, der die Verzögerung verursacht.
  • die zeitlichen Auswirkungen des erkannten Engpasses benennen.

Erfahren Sie mehr über SolarWinds® Database Performance Analyzer (DPA).