Das Blockieren von SQL Server ist ein normales Merkmal von SQL Server-Datenbanksystemen. Das Blockieren tritt auf, wenn SQL Server Anforderungen von mehreren Clients verarbeitet und verschiedene Prozesse dieselben Ressourcen gleichzeitig anfordern. Wenn eine Ressource verwendet wird, ist sie gesperrt und für nachfolgende Anforderungen nicht verfügbar, sodass der Prozess verzögert wird, bis die Ressource freigegeben wird und wieder verfügbar ist. SQL Server-Blöcke lösen sich normalerweise selbst ohne merkliche Auswirkung auf die Leistung auf. Gelegentlich führen Blöcke jedoch dazu, dass die Leistung abnimmt, entweder weil der anfängliche Prozess die Ressource für einen längeren Zeitraum sperrt, bevor er sie freigibt, oder weil der anfängliche Prozess die Ressource überhaupt nicht freigibt, wodurch auf die Ressourcen nicht zugegriffen werden kann, bis die Blockierung erfolgt ist manuell gelöst.
Wenn eine Gruppe von Ressourcen für längere Zeit blockiert ist, nimmt die Leistungsqualität bis zu dem Punkt ab, an dem Systembenutzer beginnen, Probleme zu bemerken. Zu diesen Problemen gehören Dinge wie Abfragen, die eine lange Ausführungszeit oder eine Zeitüberschreitung benötigen, oder Benutzer, die geänderte Bildschirme nicht speichern können.
So beheben Sie SQL Server-Blöcke
Die kurzfristige Lösung für die SQL Server-Blockierung besteht darin, die Transaktion zu identifizieren und manuell zu entsperren, wenn Sie feststellen, dass die Leistung durch eine oder mehrere Blockierungen negativ beeinflusst wird.
Nachdem Sie das Vorhandensein eines SQL Server-Blocks bestätigt haben, überprüfen Sie den SQL Server-Aktivitätsmonitor und beenden Sie die Abfragen, die die meisten Probleme verursachen. Sie können auch SQL-Skripts verwenden, um den Zustand des Sperrens und Blockierens auf SQL Server kontinuierlich zu überwachen. Brent Ozar schlägt vor, einige blockierungsspezifische Leistungsindikatoren hinzuzufügen, damit SQL Server Sie benachrichtigt, wenn Sie Ihre festgelegten Blockierungsschwellenwerte überschritten haben.
So verhindern Sie SQL Server-Blockierungen
Für einen Datenbankadministrator ist es hilfreich zu wissen, wie ein SQL Server-Block behoben wird. Um ein hochleistungsfähiges System zu erhalten, ist es jedoch noch besser zu wissen, wie das Auftreten von Blockierungen verhindert oder zumindest minimiert werden kann. Hier sind vier Tipps, um einige gängige Arten der SQL Server-Blockierung zu minimieren:
1. Indizes verwenden
Die Verwendung von Clustered-Indizes in Tabellen mit hoher Auslastung trägt dazu bei, die Blockierung zu reduzieren, indem der Abfrageoptimierer aufgefordert wird, eine Indexsuche anstelle eines Indexscans auszuführen. Wenn nur der zu aktualisierende Datensatz gesperrt ist, können nachfolgende Prozesse die Sperre umgehen und abgeschlossen werden.
Es ist auch wichtig sicherzustellen, dass UPDATE- und DELETE-Anweisungen Indizes verwenden. Indizes helfen UPDATE- und DELETE-Anweisungen dabei, die Anzahl der Modifikationssperren zu reduzieren, die sie erwerben, indem sie entweder Nonclustered-Indizes oder Indexhinweise verwenden, um Sperren zu entfernen.
2. Bereinigen Sie Ihre Abfragen
Eine bewährte Methode zur Vermeidung von SQL Server-Blöcken besteht darin, lange Transaktionen in mehrere kürzere Transaktionen aufzuteilen. Abfragen mit langer Laufzeit halten für die Dauer der Transaktion eine Sperre, wodurch die Ressource für andere Prozesse nicht verfügbar ist. Das Aufteilen langer Transaktionen in kurze hält die Daten in Bewegung.
Erwägen Sie die Verwendung der SQL Server-Optimierung, um Abfragen so effizient wie möglich zu gestalten. Ein guter Abfrageoptimierer schreibt und überschreibt Abfragen, bis sie so konfiguriert sind, dass sie die Anzahl der Blöcke reduzieren, die die Leistung beeinträchtigen können.
3. Identifizieren Sie die Hauptursache für die Blockierung von SQL Server
Das Nachverfolgen von Leistungsmetriken im Laufe der Zeit ist eine großartige Möglichkeit, um die Blockierung von SQL Server zu vermeiden. Indem Sie feststellen, welche Sitzungen häufig blockiert werden und welche Anweisungen betroffen sind, können Sie eine Vorgehensweise festlegen, um die Hauptursachen wiederkehrender Blockierungen durch Indizierung, Abfrageoptimierung oder andere Mittel zu beseitigen.
Ein weiterer Ort, an dem Sie nach der Grundursache für Blockierungen suchen können, ist die Arbeitslast des Systems. Führen Sie eine Workload-Analyse durch, um festzustellen, ob es zu einem Anstieg gekommen ist. Eine zu hohe Arbeitslast führt dazu, dass SQL Server blockiert wird, da sich die wachsende Zahl von Abfragen häuft und auf den Zugriff auf gesperrte Ressourcen wartet. Möglicherweise müssen Sie Indizes hinzufügen oder die Arbeitslast auf mehrere Datenbanken verteilen, um Leistungsprobleme bei hoher Arbeitslast zu lösen.
4. Halten Sie Ihre Statistiken auf dem neuesten Stand
Veraltete Statistiken können die Ausführung ineffizienter Abfragepläne auslösen, da der Plan nicht aktualisiert wurde, um Änderungen zu berücksichtigen. SQL Server startet Such-Crawls, um nach verschobenen oder fehlenden Daten zu suchen, wodurch wiederum Blöcke erstellt werden.
Der effektivste Weg, Statistiken auf dem neuesten Stand zu halten, besteht darin, so viele Aktualisierungen wie möglich zu automatisieren. Wenn Sie keine automatischen Updates planen können, stellen Sie sicher, dass Sie manuelle Updates zu Ihrer geplanten Wartungscheckliste hinzufügen, um sicherzustellen, dass die Updates regelmäßig durchgeführt werden.
Das Blockieren von SQL Server mag eine Tatsache des DBA-Lebens sein, aber es gibt Möglichkeiten, die Auswirkungen auf die Leistung Ihrer SQL Server-Datenbank zu mindern. Durchbrechen Sie den Block-Unblock-Zyklus, indem Sie einige der oben beschriebenen Strategien umsetzen. Mit ein wenig Planung, Optimierung und Automatisierung ist es möglich, das Auftreten von SQL Server-Blockierungen zu reduzieren – und unter bestimmten Umständen ganz zu beseitigen.