sql >> Database teknologi >  >> RDS >> Database

Grundlæggende om sys.dm_exec_requests

Ydeevneovervågning og fejlfinding i SQL Server er et stort emne. I SQL Server 2005 er dynamiske administrationsvisninger, også kendt som DMV'er, blevet introduceret og blev et vigtigt hjælpeværktøj til at diagnosticere SQL Server-ydeevneproblemer. Samtidig kan vi bruge dynamiske administrationsvisninger til Azure SQL Database. Nogle af dem kan afvige fra SQL Server on-premise database, men logikken i arbejdet er stadig den samme. Microsoft har meget god dokumentation om dynamiske ledelsesvisninger. Det eneste, du skal være forsigtig med versionen og produktvalideringen af ​​dynamiske administrationsvisninger. Som f.eks. sys.dm_exec_request er tilgængelig for SQL Server 2008 og nyere versioner og til Azure SQL-database, men sys.dm_db_wait_stats er kun gyldig for Azure SQL-database.

I dette indlæg vil vi tale om det grundlæggende i sys.dm_exec_request. sys.dm_exec_requests er en dynamisk administrationsvisning, som kun returnerer de anmodninger, der udføres i øjeblikket. Det betyder, at når du kører sys.dm_exec_requests-forespørgslen, tager den øjebliksbilleder af en anmodning, som kører på det tidspunkt og ikke inkluderer nogen historiske data. Derfor er denne visning meget praktisk til overvågning af realtidsanmodninger. Med andre ord giver det svaret på "hvad sker der lige nu på min server?" Denne visning indeholder en masse detaljer, men vi vil diskutere de vigtigste.

session_id :Denne værdi definerer et sessionsidentifikationsnummer. I SQL Server er sessions-id'er, der er lig med eller mindre end 50, dedikeret til baggrundsprocessen.

starttid :Denne værdi definerer startdatoen og tidspunktet for anmodningen.

status :Denne værdi definerer en status for anmodningen. De tilgængelige statusser er:

  • baggrund
  • kører
  • kørbar
  • sove
  • suspenderet
SELECT DISTINCT statusFROM sys.dm_exec_requestsWHERE session_id <>@@SPID

baggrund :Denne statustype definerer baggrundsprocesserne. Nogle af dem er DOVEN SKRIVER, CHECKPOINT og LOG WRITER.

vælg session_id, kommando, os_thread_id fra sys.dm_exec_requests som 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 =w.thread_address =w.thread_id_address hvor 5 session_id_address =w.task_address session_id

løb :Denne statustype definerer, at anmodningen behandles af CPU.

 vælg * fra sys.dm_exec_requests, hvor status='running' og session_id <>@@SPID

kørbar :Denne statustype kan ganske enkelt defineres som en anmodning, der venter i CPU-køen på at køre. Hvis du opdager en masse af kørebare processer i sys.dm_exec_requests, kan det være et symptom på CPU-tryk. Denne metrik er ikke nok til at diagnosticere dette CPU-ydelsesproblem. På grund af denne grund er vi nødt til at understøtte denne sag med flere beviser. Dette er vigtigt for os at bevise vores teori. Den dynamiske administrationsvisning sys.dm_os_wait_stats inkluderer en kolonne, som er signal_wait_time_ms. Denne kolonneværdi kan være en hjælp til at bestemme CPU-problemet. Følgende forespørgsel viser os procentdelen af ​​Signalwait. Hvis denne metrik har en høj værdi, står du sandsynligvis over for et CPU-ydeevneproblem. Du kan uddybe din anmeldelse på denne måde.

---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) 20,2)) FRA sys.dm_os_wait_stats;

suspenderet :Denne statustype definerer venteprocessen for en eller anden ressource. Det kan være I/O, LOCK og LATCH osv. Som nævnt ovenfor kan vi bruge sys.dm_os_wait_stats dynamisk administrationsvisning til at registrere wait_time_ms.

sove :Det betyder, at anmodningen er forbundet til SQL Server, men ikke i øjeblikket kører nogen kommandoer.

kommando :Denne kolonne definerer en type kommando, som udføres. Samtidig kan vi finde yderligere information for bestemte kommandoer, som er et fuldførelsesforhold. Ifølge online-bøgerne er disse;

ÆNDRING AF INDEKS OMORGANISER

AUTO_SHRINK mulighed med ALTER DATABASE

BACKUP DATABASE

DBCC CHECKDB

DBCC CHECKFILEGROUP

DBCC KONTROLTABEL

DBCC INDEXDEFRAG

DBCC SHRINKDATABASE

DBCC SHRINKFILE

GENOPRETTELSE

GENDAN DATABASE

TILBAGE

TDE KRYPTERING

Demo :

  • Tilslut masterdatabasen og start sikkerhedskopieringen for enhver database.
    BACKUP DATABASE WideWorldImporters TO DISK ='NUL'

    Tip :Når du tager database-backupen til "NUL"-enheden, skriver SQL Server ikke en backup-fil nogen steder, og du undgår sletning af en test backup-fil. Men brug ikke denne kommando i dit produktionsmiljø. Det kan forårsage at LSN-kæden brydes.

Udfør følgende forespørgsel:

SELECT command,percent_complete ,*FROM sys.dm_exec_requestsWHERE session_id <>@@SPIDand session_id>50 og command='BACKUP DATABASE'

sql_handle :Denne værdi definerer SQL-sætningen for anmodningen. Men denne værdi er i bitmap-formatet. Af denne grund er vi nødt til at bruge sys.dm_exec_sql_text table-valued funktion til at konvertere værdien til meningsfuld tekst.

vælg session_id ,command , sqltxt.text ,database_idfrom sys.dm_exec_requests reqCROSS APPLY sys.dm_exec_sql_text(req.sql_handle) som sqltxtwhere session_id@@SPID AND session_id>50 

database_id :Denne værdi definerer, hvilken database der foretager anmodningen. Vi kan forbinde dette felt med sys.databases for at få databasenavnet.

vælg session_id ,command , sqltxt.text ,db.namefrom sys.dm_exec_requests reqCROSS APPLY sys.dm_exec_sql_text(req.sql_handle) som sqltxtinner join sys.databases db =where-session session_id>50

wait_type :Denne værdi definerer den aktuelle ventetype for anmodningen. Hvis varigheden af ​​forespørgselsudførelsen tager længere tid end forventet, kan du kontrollere og bestemme ventetypen for forespørgsel.

transaction_isolation_level :Denne værdi definerer transaktionsniveauet for den indsendte forespørgsel:

0=Uspecificeret

1=Læst Ikke-forpligtet

2=ReadCommitted

3=Gentagelig

4=Serialiserbar

5=Snapshot

select session_id ,command , sqltxt.text ,db.name,req.status,wait_type ,transaction_isolation_level,CASE transaction_isolation_levelWHEN 0 THEN 'Unspecificed'WHEN 1 THEN 'ReadUncomitted'WHEN 2 THENHENHEN 'WHEN'Readable THENHEN 4 SÅ 'Serialisable'NÅR 5 SÅ 'Snapshot'ENDAS isolation_level_namefrom sys.dm_exec_requests reqCROSS APPLY sys.dm_exec_sql_text(req.sql_handle) as sqltxtinner join =reqltxtinner join =reqltxtinner session =db@qddatabase_ID på db@qdatabase_ID>db_id_database_ID på sys. 50

blocking_session_id :Det er sessionens id, der blokerer anmodningen. Hvis denne kolonne er NULL, har anmodningen ikke blokeret nogen session.

Demo :

  • Åbn SQL Server Management Studio, og udfør følgende forespørgsel.
    DROP TABLE HVIS FINDER TestPerfomonGOCREATE TABLE TestPerfomon(ID INT ,Nm VARCHAR(100))INSERT INTO TestPerfomonVALUES(1,1)GOBEGIN TRANUPDATE Nm='2 'WHERE ID=1SELECT @@SPID AS blocking_session_id

Åbn et nyt forespørgselsvindue, og udfør følgende forespørgsel.

INDSTIL TRANSAKTIONSISOLATIONSNIVEAU Serialiserbar.BEGIN TRANSOPDATERING TestPerfomon SET Nm='3'WHERE ID=1

Åbn endnu et nyt forespørgselsvindue, og kør denne DMV-forespørgsel.

select session_id ,command , sqltxt.text ,db.name,req.status,wait_type ,transaction_isolation_level,CASE transaction_isolation_levelWHEN 0 THEN 'Unspecificed'WHEN 1 THEN 'ReadUncomitted'WHEN 2 THENHENHEN 'WHEN'Readable THENHEN 4 SÅ 'Serialiseres' NÅR 5 SÅ 'Snapshot'ENDAS isolation_level_name ,blocking_session_idfrom sys.dm_exec_requests reqCROSS APPLY sys.dm_exec_sql_text(req.sql_handle) as join sqlwhere_txtsession@dSP session_id>50

Med denne demonstration fandt vi ud af årsagen til, at den anden forespørgsel er blokeret, og hvilken session der er blokeret for anmodningen. Når du kører sp_BlitzWho 65, kan du finde ud af detaljerne om blokering og de blokerede sessionsdetaljer.

sp_BlitzWho 65

I denne demonstration hentede vi detaljerne om blokering og blokerede sessioner og på samme tid fik vi detaljerne om disse sessioner. Dette er en meget grundlæggende demonstration, men den viser, hvordan problemet kan løses.

I dette indlæg talte vi om sys.sys.dm_exec_requests. Denne dynamiske administrationsvisning giver os fleksibiliteten til at få et øjebliksbillede under det aktuelle trin af en anmodning. Disse detaljerede data kan også hjælpe eller guide os gennem processen med at opdage problemet.

Referencer

  • sys.dm_exec_requests (Transact-SQL)
  • Overvågning af Azure SQL Database ved hjælp af dynamiske administrationsvisninger
  • sys.dm_db_wait_stats (Azure SQL-database)

Nyttigt værktøj:

dbForge Monitor – tilføjelsesmodul til Microsoft SQL Server Management Studio, der giver dig mulighed for at spore og analysere SQL Server-ydeevne.


  1. SUM() Funktion i PostgreSQL

  2. PostgreSQL belastningsbalancering og ProxySQL-forbedringer - ClusterControl 1.5

  3. Sådan installeres MySQL Workbench på Windows

  4. Hvad skal jeg undslippe, når jeg sender en forespørgsel?