sql >> Databáze >  >> RDS >> Database

Základy sys.dm_exec_requests

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.


  1. Oracle po uzavření sady výsledků neodstraní kurzory

  2. SQL dotaz pro zobrazení nejbližšího data?

  3. Jak ručně nakonfigurovat server Glassfish v Eclipse

  4. Problém s nasazením sestavy SSRS 2014