sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man får SQL Server-statistikinformation med hjälp av systemstatistiska funktioner

Ofta behöver vi samla systemstatistik angående körning av SQL Server-instanser, såsom antalet totala anslutningar som försökts till SQL Server-instanser sedan starten, eller tiden som SQL Server tillbringade i aktiva operationer, etc. Microsoft gav oss en separat uppsättning av systemfunktioner för att hämta systemrelaterad statistik. Idag ska jag förklara sådana systemstatistiska funktioner med användningsfallen.

Systemstatistiska funktioner i SQL

Systemstatistiska funktioner är en typ av skalärfunktion som returnerar ett enda värde i utdata. Den här ger statistisk information om systemet. En viktig anmärkning är att alla funktioner som faller under denna kategori inte kommer att returnera samma utdata när du kör dem. För varje utförande får du ett annat resultat. Det är därför systemstatistiska funktioner är icke-deterministiska.

SQL Server har flera inbyggda systemstatistiska funktioner som returnerar den systemrelaterade statistiken. Nedan är listan:

  • @@ANSLUTNINGAR
  • @@PACK_RECEIVED
  • @@CPU_BUSY
  • @@PACK_SENT
  • @@TIMETICKS
  • @@IDLE
  • @@TOTAL_ERRORS
  • @@IO_BUSY
  • @@TOTAL_READ
  • fn_virtualfilestats
  • @@PACKET_ERRORS
  • @@TOTAL_WRITE

Låt oss nu utforska dem djupare.

Förstå systemfunktionerna @@CPU_BUSY och @@TIMETICKS

@@CPU_BUSY är avgörande när vi behöver förstå hur mycket tid i millisekunder CPU har ägnat åt att arbeta med SQL Server-operationer. Resultatet av den här funktionen är inkrementellt varje gång du kör den sedan den senaste omstarten av SQL Server. Det betyder att vi för varje körning får ett inkrementellt värde i utdata. Se exemplet:

--Execute below T-SQL to get how busy your CPU is
SELECT @@CPU_BUSY

Utdata:

Den returnerar ett enda numeriskt värde vilket betyder att CPU:n har spenderat 641 millisekunder på att köra SQL Server-transaktionerna sedan den senaste omstarten av SQL Server-tjänsten.

Låt oss nu köra en enkel SELECT-sats. Jag kommer att köra ovanstående T-SQL-sats igen för att verifiera om utdata är inkrementell.

--Fetch top 1000 rows for a table
SELECT TOP (1000) [BusinessEntityID]
      ,[PersonType]
      ,[NameStyle]
      ,[Title]
      ,[FirstName]
      ,[MiddleName]
      ,[LastName]
      ,[Suffix]
      ,[EmailPromotion]
      ,[AdditionalContactInfo]
      ,[Demographics]
      ,[rowguid]
      ,[ModifiedDate]
  FROM [AdventureWorks2019].[Person].[Person]

Utdata:

Låt oss köra SELECT @@CPU_BUSY igen för att se dess utdata:

Här kan vi se ett inkrementellt värde på 653 millisekunder jämfört med värdet på 641 millisekunder som returnerades i den första skärmdumpen. Därför har vi validerat att dessa systemfunktioner returnerar enstaka inkrementella värden.

Nu, låt oss dyka djupare. Vi kommer att kontrollera hur man använder @@CPU_BUSY i olika scenarier för våra krav.

Som nämnts ovan, @@CPU_BUSY systemfunktionen returnerar utdata i millisekunder . Om du vill få dess utdata på mikrosekunder måste du använda @@TIMETICKS funktion medan du kör @@CPU_BUSY T-SQL-satsen (se kommandona nedan).

@@TIMETICKS returnerar antalet mikrosekunder per bock .

Tick ​​är ett slags schemaläggningshändelse som får schemaläggarna att köra. Mängden tid per bock är det datorberoende värdet som kan hämtas genom att köra nedanstående T-SQL-sats:

--Get @@TIMETICKS output
SELECT @@TIMETICKS

Här är dess utdata:

Vi kommer att använda båda funktionerna tillsammans för att få deras utdata i mikrosekunder och sekunder:

--Get @@CPU_BUSY output in Microseconds & seconds
SELECT @@CPU_BUSY*@@TIMETICKS As [CPU Busy Microseconds]
Go
SELECT @@CPU_BUSY*@@TIMETICKS/1000000 As [CPU Busy Seconds]
Go 

Efter att ha kört båda T-SQL-satserna kan vi se utdata:

Obs:Om du har ett krav för att få @CPU_BUSY-utdata i en flytande datatyp , du kan också få det gjort genom att köra nedanstående uppsättning satser:

--Get @@CPU_BUSY output in Microseconds & seconds with float data type
SELECT @@CPU_BUSY*CAST (@@TIMETICKS As float) As [CPU Busy Microseconds], 
@@CPU_BUSY*CAST (@@TIMETICKS As float)/1000000 As [CPU Busy Seconds]
Go

Utdata:

Fortsätt och använd @@CPU_BUSY &@@TIMETICK-systemfunktionerna enligt ditt företags behov.

Förstå @@IO_BUSY systemfunktion

Som namnet antyder returnerar denna systemfunktion den totala tiden i millisekunder som SQL Server har ägnat åt att utföra IO-operationer (Input\Output-operationer) sedan den senaste omstarten av SQL Server. Utdata från denna systemfunktion är också inkrementell varje gång du kör den.

Kör nedanstående T-SQL-sats:

--Get total time SQL Server has taken in IO operations since its last restart
SELECT @@IO_BUSY

Utdata i bilden nedan är 194 millisekunder.

Vi kan också använda @@TIMETICKS-systemfunktionen för att få värdet i mikrosekunder:

--Get total time SQL Server has taken in IO operations since its last restart
SELECT @@IO_BUSY*@@TIMETICKS AS [IO Microseconds]
GO
SELECT @@IO_BUSY*@@TIMETICKS/1000000 AS [IO Seconds]

Här är utdata från ovanstående T-SQL-sats:

Om du vill undvika aritmetiskt spill medan du konverterar värdet till mikrosekunder med hjälp av @@TIMETICKS-systemfunktionen, kör kommandot nedan för att få dess utdata i en flytande datatyp som vi har gjort för @@CPU_BUSY-funktionen tidigare:

--Get total time SQL Server has taken in IO operations since its last restart
SELECT @@IO_BUSY*CAST (@@TIMETICKS As float) AS [IO Microseconds]
GO
SELECT @@IO_BUSY*CAST (@@TIMETICKS As float)/1000000 AS [IO Seconds]
Go

Förstå @@IDLE-systemets funktion

Denna systemfunktion returnerar tiden i millisekunder för SQL Server inaktiv status sedan den senaste omstarten. Kör kommandot nedan:

--Get total time SQL Server was idle
SELECT @@IDLE

Här är resultatet:

Du kan också använda funktionen GETDATE() tillsammans med alla ovanstående systemfunktioner för att få deras värde mellan den aktuella tiden och tiden då SQL Server startade om. Om du vill få detta värde i mikrosekunder, använd @@TIMETICKS-funktionen som visas för funktionerna @@CPU_BUSY och @@IO_BUSY.

T-SQL-satsen nedan är mycket lik de tidigare exemplen. Den returnerar antalet sekunder och mikrosekunder i en flytdatatyp.

--Get total time SQL Server was idle
SELECT @@IDLE* CAST(@@TIMETICKS AS Float) As [IO Microseconds]
GO
SELECT @@IDLE*CAST(@@TIMETICKS AS Float)/1000000 AS [IO Seconds]
Go

Utdata:

Förstå @@PACK_SENT, @@PACK_RECEIVED och @@PACKET_ERRORS

Dessa systemstatistiska funktioner relaterar till nätverkspaket. De är extremt användbara för att analysera informationen om nätverkspaket.

  • @@PACK_SENT – returnerar antalet utdatapaket som skrivits till nätverket av SQL Server sedan den senaste omstarten.
  • @@PACK_RECEIVED – visar antalet indatapaket som lästs från nätverket av SQL Server sedan den senaste omstarten.
  • @@PACKET_ERRORS – visar antalet nätverkspaketfel som har inträffat på SQL Server-anslutningar sedan den senaste omstarten.

Vi kan använda nedanstående T-SQL-satser för att få antalet in- och utdatapaket att läsa eller skriva av SQL Server.

--Get the number of packets received or sent
SELECT @@PACK_SENT AS [Packets Sent]
GO
SELECT @@PACK_RECEIVED AS [Packets RECIEVED]
GO

Detaljerna om dessa paket finns i utdata:

Du kan också köra @@PACKET_ERRORS på samma sätt för att få det totala antalet paketfel:

--Get number of packets Errors
SELECT @@PACKET_ERRORS

Förstå @@TOTAL_READ, @@TOTAL_WRITE och @@TOTAL_ERRORS

De diskrelaterade systemstatistiska funktionerna får antalet diskläsningar, diskskrivnings- och diskskrivningsfel som SQL Server har utfört.

  • @@TOTAL_READ – visar antalet diskläsningar av SQL Server sedan den senaste omstarten.
  • @@TOTAL_WRITE – visar antalet diskskrivningar av SQL Server sedan den senaste omstarten.
  • @@TOTAL_ERRORS – visar antalet diskskrivfel av SQL Server sedan den senaste omstarten. Kom ihåg att icke-fatala skrivfel inte fångas upp av den här funktionen – de hanteras av systemet självt.

Jag har klubbat alla 3 systemfunktionerna i en T-SQL-sats för att visa utdata från dem alla i en shot:

--Get Disk related statistics
SELECT @@TOTAL_READ AS [Reads], 
@@TOTAL_WRITE AS [Writes], 
@@TOTAL_ERRORS As [Disk Errors]

Nedan kan du se antalet läs-, skriv- och skrivfel på disken:

Förstå @@CONNECTIONS systemfunktion

Denna systemfunktion visar det totala antalet försök att ansluta till SQL Server, oavsett om de har lyckats sedan den senaste omstarten av SQL Server. Kör nedanstående T-SQL-sats:

--Get the number of attempted connections
SELECT @@CONNECTIONS AS [Total Connections]

Utdata nedan visar att det totala antalet anslutningsförsök är 3130 för denna SQL Server-instans. Det betyder inte att alla 3130 försök var framgångsrika.

Alla systemstatistiska funktioner i ett T-SQL-uttalande

Vi kan också kombinera alla dessa systemfunktioner i en T-SQL-sats och få en enda utdata för varje systemstatistikvärde. Jag har förklarat var och en av systemfunktionerna separat eftersom dessa kan vara mycket användbara för dina arbetsbehov och krav.

Kör T-SQL-skriptet nedan för att få utdata från all beskrivna systemstatistik i ett enda steg:

--Get system statistics
SELECT @@CPU_BUSY*CAST (@@TIMETICKS As float) As [CPU Busy Microseconds],
@@CPU_BUSY*CAST (@@TIMETICKS As float)/1000000 As [CPU Busy Seconds],
@@IO_BUSY*CAST (@@TIMETICKS As float) AS [IO Microseconds],
@@IO_BUSY*CAST (@@TIMETICKS As float)/1000000 AS [IO Seconds],
@@IDLE* CAST(@@TIMETICKS AS Float) As [IO Microseconds],
@@IDLE*CAST(@@TIMETICKS AS Float)/1000000 AS [IO Seconds],
@@PACK_SENT AS [Packets Sent],
@@PACK_RECEIVED AS [Packets RECIEVED],
@@TOTAL_READ AS [Reads], 
@@TOTAL_WRITE AS [Writes], 
@@TOTAL_ERRORS As [Disk Errors],
@@CONNECTIONS AS [Total Connections]

Här är utdata från ovanstående skript som visar all statistikrelaterad information i en utdata:

Använda lagrad procedur för att hämta SQL Server-statistik

Det finns också en dedikerad Microsoft-systemlagrad procedur som låter oss se en liknande vy av systemstatistiken . Namnet på denna lagrade procedur är sp_monitor . Det är utmärkt för att spåra användningen och värdena för varje SQL Server-statistiktyp sedan den senaste körningen med samma lagrade procedur

Obs:Du måste ha rollen sysadmin för att utföra denna lagrade procedur.

Jag har kört sp_monitor lagrad procedur – se att den visas i en specifik form som värde(värde)-värde% eller värde(värde). Vi kan se cpu_busy output som visas som 20(19)-0%. Nu kanske du funderar på hur vi kan läsa denna produktion. Läs och förstå tabellen nedan – den presenterar förklaringen för båda utdatatyperna:

Systemparameter Utdata Tolkning
Cpu_busy 20(19)-0 % CPU var upptagen 20 sekunder sedan SQL Server senast startade\restartedCPU var upptagen 19 sekunder sedan sp_monitor var den senaste körningen0 % av den totala tiden sedan sp_monitor kördes senast.
Packets_received 1467(1428) SQL Server har tagit emot 1467 paket sedan den senast startade\restartedSQL Server har tagit emot 1428 paket sedan sp_monitor kördes förra gången.

Slutsats

Nu kan du se hur du får den systemrelaterade statistiken för din SQL Server-instans. Systemets funktioner och lagrad procedur sp_monitor kommer att vara mycket effektivt och bekvämt. Varsågod och använd dessa T-SQL-koder i ditt utvecklingsarbete eller för systemanalysaktiviteter.

Dela den här artikeln på dina favorit sociala nätverk. Och om du vill diskutera denna information och dela dina åsikter och tips är du välkommen till kommentarsektionen.


  1. Hanterad ODP.NET-drivrutin visas inte i dialogrutan Datakälla

  2. hur man använder Blob datatype i Postgres

  3. PostgreSQL 11:Patchgranskare för partitionering av patchar

  4. Wordnet sqlite Synonymer och exempel