Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Beliebte Tricks zur Leistungsoptimierung

Hier ist die handliche Liste der Dinge, die ich immer jemandem gebe, der mich nach Optimierung fragt.
Wir verwenden hauptsächlich Sybase, aber die meisten Ratschläge gelten allgemein.

SQL Server zum Beispiel kommt mit einer Vielzahl von Leistungsüberwachungs-/Tuning-Bits, aber wenn Sie so etwas nicht haben (und vielleicht sogar, wenn Sie es haben), dann würde ich Folgendes in Betracht ziehen...

99 % der Probleme Ich habe gesehen, dass sie dadurch verursacht werden, dass zu viele Tabellen in einen Join eingefügt werden . Die Lösung dafür besteht darin, die Hälfte des Joins (mit einigen Tabellen) durchzuführen und die Ergebnisse in einer temporären Tabelle zwischenzuspeichern. Führen Sie dann den Rest der Abfrageverknüpfung für diese temporäre Tabelle durch.

Checkliste zur Abfrageoptimierung

  • Führen Sie UPDATE STATISTICS für die zugrunde liegenden Tabellen aus
    • Viele Systeme führen dies als geplanten wöchentlichen Job aus
  • Löschen Sie Datensätze aus zugrunde liegenden Tabellen (evtl. archivieren Sie die gelöschten Datensätze)
    • Erwägen Sie, dies automatisch einmal täglich oder einmal wöchentlich zu tun.
  • Indizes neu aufbauen
  • Tabellen neu erstellen (bcp-Daten aus/ein)
  • Dump/Neuladen der Datenbank (drastisch, kann aber Beschädigungen beheben)
  • Neuen, geeigneteren Index erstellen
  • Führen Sie DBCC aus, um zu sehen, ob die Datenbank möglicherweise beschädigt ist
  • Sperren / Deadlocks
    • Stellen Sie sicher, dass keine anderen Prozesse in der Datenbank laufen
      • Besonders DBCC
    • Verwenden Sie Sperren auf Zeilen- oder Seitenebene?
    • Sperren Sie die Tabellen exklusiv, bevor Sie die Abfrage starten
    • Überprüfen Sie, ob alle Prozesse in derselben Reihenfolge auf Tabellen zugreifen
  • Werden Indizes angemessen verwendet?
    • Joins verwenden den Index nur, wenn beide Ausdrücke genau denselben Datentyp haben
    • Der Index wird nur verwendet, wenn die ersten Felder im Index in der Abfrage übereinstimmen
    • Werden gegebenenfalls geclusterte Indizes verwendet?
      • Bereichsdaten
      • WHERE-Feld zwischen Wert1 und Wert2
  • Kleine Joins sind schöne Joins
    • Standardmäßig berücksichtigt der Optimierer nur 4 Tabellen gleichzeitig.
    • Das bedeutet, dass bei Joins mit mehr als 4 Tabellen eine gute Chance besteht, dass ein nicht optimaler Abfrageplan gewählt wird
  • Beenden Sie den Join
    • Können Sie den Join auflösen?
    • Fremdschlüssel in einer temporären Tabelle vorab auswählen
    • Machen Sie die Hälfte des Joins und fügen Sie die Ergebnisse in eine temporäre Tabelle ein
  • Verwenden Sie die richtige Art von temporärer Tabelle?
    • #temp Tabellen können viel besser abschneiden als @table Variablen mit großen Volumina (Tausende von Zeilen).
  • Übersichtstabellen pflegen
    • Mit Triggern auf den zugrunde liegenden Tabellen erstellen
    • Erstellen Sie täglich / stündlich / etc.
    • Ad-hoc erstellen
    • Inkrementell erstellen oder abreißen/neu erstellen
  • Mit SET SHOWPLAN ON sehen Sie, was der Abfrageplan ist
  • Sehen Sie, was mit SET STATS IO ON tatsächlich passiert
  • Erzwingen Sie einen Index mit dem Pragma:(index:myindex)
  • Erzwingen Sie die Tabellenreihenfolge mit SET FORCEPLAN ON
  • Parameter-Sniffing:
    • Gespeicherte Prozedur in 2 zerlegen
    • proc2 von proc1 aufrufen
    • ermöglicht dem Optimierer, den Index in proc2 zu wählen, wenn @parameter von proc1 geändert wurde
  • Können Sie Ihre Hardware verbessern?
  • Um wie viel Uhr läufst du? Gibt es eine ruhigere Zeit?
  • Läuft Replication Server (oder ein anderer ununterbrochener Prozess)? Kannst du es aussetzen? Führen Sie es zB. stündlich?