Leistungsüberwachung und Fehlerbehebung in SQL Server ist ein umfangreiches Thema. In SQL Server 2005 wurden dynamische Verwaltungsansichten, auch bekannt als DMVs, eingeführt und wurden zu einem unverzichtbaren Hilfsmittel für die Diagnose von SQL Server-Leistungsproblemen. Gleichzeitig können wir dynamische Verwaltungsansichten für Azure SQL-Datenbank verwenden. Einige von ihnen können sich von der lokalen SQL Server-Datenbank unterscheiden, aber die Arbeitslogik ist immer noch dieselbe. Microsoft verfügt über eine sehr gute Dokumentation zu dynamischen Verwaltungsansichten. Das Einzige, was Sie beachten müssen, ist die Versions- und Produktvalidierung dynamischer Verwaltungsansichten. Beispielsweise ist sys.dm_exec_request für SQL Server 2008 und höhere Versionen und für die Azure SQL-Datenbank verfügbar, aber sys.dm_db_wait_stats ist nur für die Azure SQL-Datenbank gültig.
In diesem Beitrag werden wir über die Grundlagen von sys.dm_exec_request sprechen. sys.dm_exec_requests ist eine dynamische Verwaltungsansicht, die nur die aktuell ausgeführten Anforderungen zurückgibt. Dies bedeutet, dass beim Ausführen der Abfrage sys.dm_exec_requests eine Momentaufnahme der Anforderung erstellt wird, die zu diesem Zeitpunkt ausgeführt wird, und keine historischen Daten enthält. Daher ist diese Ansicht sehr praktisch für die Überwachung von Echtzeitanforderungen. Mit anderen Worten, es gibt die Antwort auf die Frage „Was ist gerade auf meinem Server los?“. Diese Ansicht enthält viele Details, aber wir werden die wichtigsten besprechen.
Sitzungs-ID :Dieser Wert definiert eine Sitzungsidentifikationsnummer. In SQL Server werden Sitzungs-IDs, die gleich oder kleiner als 50 sind, dem Hintergrundprozess zugeordnet.
start_time :Dieser Wert definiert das Startdatum und die Uhrzeit der Anfrage.
Status :Dieser Wert definiert einen Status der Anfrage. Die verfügbaren Status sind:
- Hintergrund
- Laufen
- lauffähig
- schlafen
- gesperrt
SELECT DISTINCT status FROM sys.dm_exec_requests WHERE session_id <>@@SPID
Hintergrund :Dieser Statustyp definiert die Hintergrundprozesse. Einige davon sind LAZY WRITER, CHECKPOINT und LOG WRITER.
select session_id, command, os_thread_id from sys.dm_exec_requests as r join sys.dm_os_workers as w on r.task_address = w.task_address join sys.dm_os_threads as t on t.thread_address = w.thread_address where session_id <= 50 order by session_id
Laufen :Dieser Statustyp definiert, dass die Anfrage von der CPU verarbeitet wird.
select * from sys.dm_exec_requests where status='running' and session_id <>@@SPID
lauffähig :Dieser Statustyp kann einfach als Anforderung definiert werden, die in der CPU-Warteschlange auf Ausführung wartet. Wenn Sie viele ausführbare Prozesse in sys.dm_exec_requests erkennen, kann dies ein Symptom für CPU-Auslastung sein. Diese Metrik reicht nicht aus, um dieses CPU-Leistungsproblem zu diagnostizieren. Aus diesem Grund müssen wir diesen Fall mit mehr Beweisen untermauern. Dies ist für uns von Bedeutung, um unsere Theorie zu beweisen. Die dynamische Verwaltungsansicht sys.dm_os_wait_stats enthält eine Spalte mit der Bezeichnung signal_wait_time_ms. Dieser Spaltenwert kann hilfreich sein, um das CPU-Problem zu ermitteln. Die folgende Abfrage zeigt uns den Prozentsatz von Signalwait. Wenn diese Metrik einen hohen Wert hat, haben Sie höchstwahrscheinlich ein Problem mit der CPU-Leistung. Auf diese Weise können Sie Ihre Bewertung vertiefen.
---https://sqlserverperformance.wordpress.com/page/146/ ---Glenn Berry's SQL Server Performance SELECT signal_wait_time_ms=SUM(signal_wait_time_ms) ,'%signal (cpu) waits' = CAST(100.0 * SUM(signal_wait_time_ms) / SUM (wait_time_ms) AS NUMERIC(20,2)) ,resource_wait_time_ms=SUM(wait_time_ms - signal_wait_time_ms) ,'%resource waits'= CAST(100.0 * SUM(wait_time_ms - signal_wait_time_ms) / SUM (wait_time_ms) AS NUMERIC(20,2)) FROM sys.dm_os_wait_stats;
gesperrt :Dieser Statustyp definiert den Warteprozess einer Ressource. Es kann I/O, LOCK und LATCH usw. sein. Wie oben erwähnt, können wir die sys.dm_os_wait_stats verwenden dynamische Verwaltungsansicht zum Erkennen von wait_time_ms.
schlafen :Dies bedeutet, dass die Anfrage mit SQL Server verbunden ist, aber derzeit keine Befehle ausgeführt werden.
Befehl :Diese Spalte definiert einen Befehlstyp, der ausgeführt wird. Gleichzeitig können wir zusätzliche Informationen für bestimmte Befehle finden, die eine Abschlussquote darstellen. Laut den Online-Büchern sind dies:
ALTER INDEX NEU ORGANISIEREN
AUTO_SHRINK-Option mit ALTER DATABASE
BACKUP-DATENBANK
DBCC-CHECKDB
DBCC CHECKFILEGROUP
DBCC-PRÜFTABELLE
DBCC INDEXDEFRAG
DBCC SHRINKDATABASE
DBCC SHRINKFILE
WIEDERHERSTELLUNG
DATENBANK WIEDERHERSTELLEN
ZURÜCKSETZEN
TDE-VERSCHLÜSSELUNG
Demo :
- Verbinden Sie die Master-Datenbank und starten Sie das Backup für jede Datenbank.
BACKUP DATABASE WideWorldImporters TO DISK ='NUL'
Tipp Hinweis:Wenn Sie die Datenbanksicherung auf das „NUL“-Gerät legen, schreibt SQL Server nirgendwo eine Sicherungsdatei, und Sie vermeiden das Löschen einer Testsicherungsdatei. Verwenden Sie diesen Befehl jedoch nicht in Ihrer Produktionsumgebung. Dies kann dazu führen, dass die LSN-Kette unterbrochen wird.
Führen Sie die folgende Abfrage aus:
SELECT command,percent_complete ,* FROM sys.dm_exec_requests WHERE session_id <>@@SPID and session_id>50 and command='BACKUP DATABASE'
sql_handle :Dieser Wert definiert die SQL-Anweisung der Anfrage. Aber dieser Wert ist im Bitmap-Format. Aus diesem Grund müssen wir die Tabellenwertfunktion sys.dm_exec_sql_text verwenden, um den Wert in aussagekräftigen Text umzuwandeln.
select session_id ,command , sqltxt.text ,database_id from sys.dm_exec_requests req CROSS APPLY sys.dm_exec_sql_text(req.sql_handle) as sqltxt where session_id<>@@SPID AND session_id>50
Datenbank-ID :Dieser Wert definiert, welche Datenbank die Anfrage stellt. Wir können dieses Feld mit sys.databases verknüpfen, um den Datenbanknamen zu erhalten.
select session_id ,command , sqltxt.text ,db.name from sys.dm_exec_requests req CROSS APPLY sys.dm_exec_sql_text(req.sql_handle) as sqltxt inner join sys.databases db on db.database_id = req.database_id where session_id<>@@SPID AND session_id>50
wait_type :Dieser Wert definiert den aktuellen Wartetyp der Anfrage. Wenn die Dauer der Abfrageausführung länger als erwartet dauert, können Sie den Wartetyp der Abfrage überprüfen und bestimmen.
transaction_isolation_level :Dieser Wert definiert die Transaktionsebene der übermittelten Abfrage:
0=Nicht angegeben
1=ReadUncommitted
2=ReadCommitted
3=Wiederholbar
4=Serialisierbar
5=Schnappschuss
select session_id ,command , sqltxt.text ,db.name,req.status,wait_type ,transaction_isolation_level, CASE transaction_isolation_level WHEN 0 THEN 'Unspecified' WHEN 1 THEN 'ReadUncomitted' WHEN 2 THEN 'ReadCommitted' WHEN 3 THEN 'Repeatable' WHEN 4 THEN 'Serializable' WHEN 5 THEN 'Snapshot' END AS isolation_level_name from sys.dm_exec_requests req CROSS APPLY sys.dm_exec_sql_text(req.sql_handle) as sqltxt inner join sys.databases db on db.database_id = req.database_id where session_id<>@@SPID AND session_id>50
blocking_session_id :Es ist die ID der Sitzung, die die Anfrage blockiert. Wenn diese Spalte NULL ist, hat die Anfrage keine Sitzung blockiert.
Demo :
- Öffnen Sie SQL Server Management Studio und führen Sie die folgende Abfrage aus.
DROP TABLE IF EXISTS TestPerfomon GO CREATE TABLE TestPerfomon (ID INT , Nm VARCHAR(100)) INSERT INTO TestPerfomon VALUES(1,1) GO BEGIN TRAN UPDATE TestPerfomon SET Nm='2' WHERE ID=1 SELECT @@SPID AS blocking_session_id
Öffnen Sie ein neues Abfragefenster und führen Sie die folgende Abfrage aus.
SET TRANSACTION ISOLATION LEVEL Serializable BEGIN TRAN UPDATE TestPerfomon SET Nm='3' WHERE ID=1
Öffnen Sie ein weiteres neues Abfragefenster und führen Sie diese DMV-Abfrage aus.
select session_id ,command , sqltxt.text ,db.name,req.status,wait_type ,transaction_isolation_level, CASE transaction_isolation_level WHEN 0 THEN 'Unspecified' WHEN 1 THEN 'ReadUncomitted' WHEN 2 THEN 'ReadCommitted' WHEN 3 THEN 'Repeatable' WHEN 4 THEN 'Serializable' WHEN 5 THEN 'Snapshot' END AS isolation_level_name , blocking_session_id from sys.dm_exec_requests req CROSS APPLY sys.dm_exec_sql_text(req.sql_handle) as sqltxt inner join sys.databases db on db.database_id = req.database_id where session_id<>@@SPID AND session_id>50
Mit dieser Demonstration haben wir herausgefunden, warum die zweite Abfrage blockiert wird und welche Sitzung die Anforderung blockiert. Wenn Sie sp_BlitzWho 65 ausführen, können Sie die Details der Blockierung und die Details der blockierten Sitzungen herausfinden.
sp_BlitzWho 65
In dieser Demonstration haben wir die Details zum Blockieren und zu blockierten Sitzungen abgerufen und gleichzeitig die Details zu diesen Sitzungen erhalten. Dies ist eine sehr einfache Demonstration, aber sie zeigt, wie das Problem gelöst werden kann.
In diesem Beitrag haben wir über sys.sys.dm_exec_requests gesprochen. Diese dynamische Verwaltungsansicht gibt uns die Flexibilität, eine Momentaufnahme während der aktuellen Stufe einer Anfrage zu erhalten. Diese detaillierten Daten können uns auch dabei helfen oder uns durch den Prozess der Problemerkennung führen.
Referenzen
- sys.dm_exec_requests (Transact-SQL)
- Überwachen der Azure SQL-Datenbank mithilfe dynamischer Verwaltungsansichten
- sys.dm_db_wait_stats (Azure SQL-Datenbank)
Nützliches Tool:
dbForge Monitor – Add-In für Microsoft SQL Server Management Studio, mit dem Sie die Leistung von SQL Server verfolgen und analysieren können.