Sledování výkonu a odstraňování problémů na serveru SQL Server je rozsáhlé téma. V SQL Server 2005 byly představeny pohledy dynamické správy, známé také jako DMV, a staly se základním pomocným nástrojem pro diagnostiku problémů s výkonem SQL Serveru. Zároveň můžeme použít dynamická zobrazení správy pro Azure SQL Database. Některé z nich se mohou lišit od on-premise databáze SQL Server, ale logika práce je stále stejná. Microsoft má velmi dobrou dokumentaci o dynamických pohledech správy. Jediná věc, musíte si dávat pozor na verzi a ověření produktu pohledů dynamické správy. Například sys.dm_exec_request je k dispozici pro SQL Server 2008 a novější verze a pro Azure SQL databázi, ale sys.dm_db_wait_stats je platný pouze pro Azure SQL databázi.
V tomto příspěvku budeme hovořit o základech sys.dm_exec_request. sys.dm_exec_requests je pohled dynamické správy, který vrací pouze aktuálně prováděné požadavky. To znamená, že když spustíte dotaz sys.dm_exec_requests, zaznamená požadavek, který běží v té době, a nezahrnuje žádná historická data. Proto je toto zobrazení velmi užitečné pro sledování požadavků v reálném čase. Jinými slovy, dává odpověď na otázku „co se právě děje na mém serveru?“ Tento pohled obsahuje mnoho podrobností, ale probereme ty nejdůležitější.
id_relace :Tato hodnota definuje identifikační číslo relace. V SQL Server jsou ID relací rovné nebo menší než 50 vyhrazeny procesu na pozadí.
čas začátku :Tato hodnota definuje počáteční datum a čas požadavku.
stav :Tato hodnota definuje stav požadavku. Dostupné stavy jsou:
- pozadí
- běh
- spustitelné
- spánek
- pozastaveno
SELECT DISTINCT status FROM sys.dm_exec_requests WHERE session_id <>@@SPID
pozadí :Tento typ stavu definuje procesy na pozadí. Některé z nich jsou LAZY WRITER, CHECKPOINT a 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
běží :Tento typ stavu definuje, že požadavek zpracovává CPU.
select * from sys.dm_exec_requests where status='running' and session_id <>@@SPID
spustitelné :Tento typ stavu lze jednoduše definovat jako požadavek, který čeká na spuštění ve frontě CPU. Pokud v sys.dm_exec_requests zjistíte velké množství spustitelných procesů, může to být příznak tlaku CPU. Tato metrika nestačí k diagnostice tohoto problému s výkonem CPU. Z tohoto důvodu musíme tento případ podpořit dalšími důkazy. To je pro nás důležité k prokázání naší teorie. Zobrazení dynamické správy sys.dm_os_wait_stats obsahuje sloupec signal_wait_time_ms. Tato hodnota sloupce může pomoci určit problém s CPU. Následující dotaz nám ukazuje procento Signalwait. Pokud má tato metrika vysokou hodnotu, s největší pravděpodobností čelíte problému s výkonem procesoru. Tímto způsobem můžete prohloubit svou recenzi.
---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;
pozastaveno :Tento typ stavu definuje proces čekání nějakého zdroje. Může to být I/O, LOCK a LATCH atd. Jak bylo uvedeno výše, můžeme použít sys.dm_os_wait_stats dynamické zobrazení správy pro zjištění wait_time_ms.
spí :Znamená to, že požadavek je připojen k serveru SQL, ale aktuálně nejsou spuštěny žádné příkazy.
příkaz :Tento sloupec definuje typ příkazu, který se provádí. Zároveň můžeme u jednotlivých příkazů najít doplňující informace, což je poměr dokončení. Podle online knih to jsou;
ALTER INDEX REORGANIZE
Možnost AUTO_SHRINK s ALTER DATABASE
ZÁLOŽNÍ DATABÁZE
DBCC CHECKDB
DBCC CHECKFILEGROUP
KONTROLNÍ TABULKA DBCC
DBCC INDEXDEFRAG
DBCC SHRINKDATABASE
DBCC SHRINKFILE
OBNOVA
OBNOVIT DATABÁZI
ROLLBACK
ŠIFROVÁNÍ TDE
Ukázka :
- Připojte hlavní databázi a spusťte zálohování jakékoli databáze.
BACKUP DATABASE WideWorldImporters TO DISK ='NUL'
Tip :Když provedete zálohu databáze na zařízení „NUL“, SQL Server nikam nezapíše záložní soubor a vyhnete se smazání testovacího záložního souboru. Tento příkaz však nepoužívejte ve svém produkčním prostředí. Může způsobit přerušení řetězce LSN.
Proveďte následující dotaz:
SELECT command,percent_complete ,* FROM sys.dm_exec_requests WHERE session_id <>@@SPID and session_id>50 and command='BACKUP DATABASE'
sql_handle :Tato hodnota definuje příkaz SQL požadavku. Ale tato hodnota je ve formátu bitmapy. Z tohoto důvodu potřebujeme k převodu hodnoty na smysluplný text použít tabulkovou funkci sys.dm_exec_sql_text.
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
database_id :Tato hodnota definuje, která databáze odešle požadavek. Můžeme spojit toto pole se sys.databases a získat název databáze.
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 :Tato hodnota definuje aktuální typ čekání požadavku. Pokud doba provádění dotazu trvá déle, než se očekávalo, můžete zkontrolovat a určit typ dotazu čekání.
úroveň_izolace_transakce :Tato hodnota definuje úroveň transakce odeslaného dotazu:
0=Nespecifikováno
1=ReadUncomitt
2=ReadCommitted
3=Opakovatelné
4=Serializovatelný
5=Snímek
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 :Je to id relace, která blokuje požadavek. Pokud je tento sloupec NULL, požadavek neblokoval žádnou relaci.
Ukázka :
- Otevřete SQL Server Management Studio a proveďte následující dotaz.
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
Otevřete okno nového dotazu a proveďte následující dotaz.
SET TRANSACTION ISOLATION LEVEL Serializable BEGIN TRAN UPDATE TestPerfomon SET Nm='3' WHERE ID=1
Otevřete další okno nového dotazu a spusťte tento dotaz DMV.
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
Pomocí této ukázky jsme zjistili důvod, proč je blokován druhý dotaz a která relace blokuje požadavek. Když spustíte sp_BlitzWho 65, můžete zjistit podrobnosti o blokování a podrobnosti o blokované relaci.
sp_BlitzWho 65
V této ukázce jsme získali podrobnosti o blokování a blokovaných relacích a zároveň jsme získali podrobnosti o těchto relacích. Toto je velmi základní ukázka, ale ukazuje, jak lze problém vyřešit.
V tomto příspěvku jsme mluvili o sys.sys.dm_exec_requests. Toto dynamické zobrazení správy nám dává flexibilitu získat snímek během aktuálního řádku požadavku. Tyto podrobné údaje nám také mohou pomoci nebo nás vést procesem odhalování problému.
Odkazy
- sys.dm_exec_requests (Transact-SQL)
- Monitorování Azure SQL Database pomocí dynamických zobrazení správy
- sys.dm_db_wait_stats (Azure SQL Database)
Užitečný nástroj:
dbForge Monitor – doplněk pro Microsoft SQL Server Management Studio, který umožňuje sledovat a analyzovat výkon SQL Serveru.