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

Sådan får du SQL Server-statistikoplysninger ved hjælp af systemstatistiske funktioner

Ofte er vi nødt til at indsamle systemstatistik vedrørende kørsel af SQL Server-forekomster, såsom antallet af samlede forbindelser forsøgt til SQL Server-forekomsten siden starten, eller den tid, som SQL Server brugte i aktive operationer osv. Microsoft bragte os et separat sæt af systemfunktioner til at hente den systemrelaterede statistik. I dag vil jeg forklare sådanne systemstatistiske funktioner med use cases.

Systemstatistiske funktioner i SQL

Systemstatistiske funktioner er en type skalarfunktion, der returnerer en enkelt værdi i outputtet. Denne giver statistisk information om systemet. En væsentlig bemærkning er, at alle funktioner, der falder ind under denne kategori, ikke vil returnere det samme output, når du udfører dem. For hver udførelse får du et andet resultat. Det er derfor, systemstatistiske funktioner er ikke-deterministiske.

SQL Server har flere indbyggede systemstatistiske funktioner, der returnerer den systemrelaterede statistik. Nedenfor er listen:

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

Lad os nu udforske dem dybere.

Forstå systemfunktionerne @@CPU_BUSY og @@TIMETICKS

@@CPU_BUSY er afgørende, når vi skal forstå, hvor meget tid i millisekunder CPU har brugt på at arbejde på SQL Server-operationer. Resultatet af denne funktion er trinvist, hver gang du kører den siden sidste genstart af SQL Server. Det betyder, at vi for hver kørsel får en trinvis værdi i outputtet. Se eksemplet:

--Kør under T-SQL for at se, hvor travlt din CPU erSELECT @@CPU_BUSY 

Udgangen:

Det returnerer en enkelt numerisk værdi, hvilket betyder, at CPU'en har brugt 641 millisekunder på at køre SQL Server-transaktionerne siden den sidste genstart af SQL Server-tjenesten.

Lad os nu udføre en simpel SELECT-sætning. Jeg vil køre ovenstående T-SQL-sætning igen for at kontrollere, om outputtet er trinvist.

--Hent top 1000 rækker til en tabel.VÆLG TOP (1000) [BusinessEntityID] ,[PersonType] ,[NameStyle],[Titel] ,[FirstName] ,[MiddleName] ,[LastName] ,[Suffiks] ,[EmailPromotion] ,[AdditionalContactInfo] ,[Demografi] ,[rowguid] ,[ModifiedDate] FRA [AdventureWorks2019].[Person].[Person] 

Udgangen:

Lad os køre SELECT @@CPU_BUSY igen for at se dens output:

Her kan vi se en trinvis værdi på 653 millisekunder sammenlignet med værdien på 641 millisekunder returneret i det første skærmbillede. Derfor har vi valideret, at disse systemfunktioner returnerer enkelte inkrementelle værdier.

Lad os nu dykke dybere. Vi skal tjekke, hvordan du bruger @@CPU_BUSY i forskellige scenarier til vores krav.

Som nævnt ovenfor er @@CPU_BUSY systemfunktionen returnerer output i millisekunder . Hvis du ønsker at få dets output på mikrosekunder , skal du bruge @@TIMETICKS funktion, mens du kører @@CPU_BUSY T-SQL-sætningen (se nedenstående kommandoer).

@@TIMETICKS returnerer antallet af mikrosekunder pr. kryds .

Tick ​​er en slags planlægningsbegivenhed, som får skemaerne til at køre. Mængden af ​​tid pr. kryds er den computerafhængige værdi, som kan hentes ved at køre nedenstående T-SQL-sætning:

--Hent @@TIMETICKS outputSELECT @@TIMETICKS 

Her er dens output:

Vi vil bruge begge funktioner sammen for at få deres output i mikrosekunder og sekunder:

--Få @@CPU_BUSY output i mikrosekunder &sekunderSELECT @@CPU_BUSY*@@TIMETICKS As [CPU Busy Microseconds]GoSELECT @@CPU_BUSY*@@TIMETICKS/1000000 As [CPU Busy Seconds]Go  

Efter at have udført begge T-SQL-sætninger, kan vi se output:

Bemærk:Hvis du har et krav for at få @CPU_BUSY output i en float datatype , kan du også få det gjort ved at køre nedenstående sæt sætninger:

--Få @@CPU_BUSY output i mikrosekunder og sekunder med float datatypeSELECT @@CPU_BUSY*CAST (@@TIMETICKS As float) Som [CPU Busy Microseconds], @@CPU_BUSY*CAST (@@TIMETICKS As float)/1000000 Som [CPU Busy Seconds]Go 

Udgangen:

Gå videre og brug @@CPU_BUSY &@@TIMETICK systemfunktionerne i henhold til din virksomheds behov.

Forstå @@IO_BUSY systemfunktion

Som navnet antyder, returnerer denne systemfunktion den samlede tid i millisekunder, som SQL Serveren har brugt på at udføre IO-operationer (Input\Output-operationer) siden sidste genstart af SQL Server. Outputtet af denne systemfunktion er også trinvis, hver gang du kører den.

Kør nedenstående T-SQL-sætning:

--Få den samlede tid, SQL Server har brugt i IO-operationer siden den sidste genstartSELECT @@IO_BUSY 

Outputtet på billedet nedenfor er 194 millisekunder.

Vi kan også bruge @@TIMETICKS systemfunktionen til at få værdien i mikrosekunder:

--Få den samlede tid, SQL Server har brugt i IO-operationer siden dens sidste genstart. /kode>

Her er outputtet af ovenstående T-SQL-sætning:

Hvis du vil undgå aritmetisk overløb, mens du konverterer værdien til mikrosekunder ved hjælp af @@TIMETICKS-systemfunktionen, skal du køre kommandoen nedenfor for at få dens output i en float-datatype, som vi tidligere har gjort for @@CPU_BUSY-funktionen:

--Få den samlede tid, SQL Server har brugt i IO-operationer siden den sidste genstart.SELECT @@IO_BUSY*CAST (@@TIMETICKS As float) AS [IO Microseconds]GOSELECT @@IO_BUSY*CAST (@@TIMETICKS As float)/1000000 AS [IO Seconds]Go 

Forstå @@IDLE-systemfunktion

Denne systemfunktion returnerer tiden i millisekunder for SQL Server inaktiv status siden sidste genstart. Kør nedenstående kommando:

--Få den samlede tid, hvor SQL Server var idleSELECT @@IDLE 

Her er outputtet:

Du kan også bruge GETDATE()-funktionen sammen med alle ovenstående systemfunktioner for at få deres værdi mellem det aktuelle tidspunkt og det tidspunkt, hvor SQL Server genstartede. Hvis du ønsker at få denne værdi i mikrosekunder, skal du bruge @@TIMETICKS-funktionen som vist for funktionerne @@CPU_BUSY og @@IO_BUSY.

Nedenstående T-SQL-sætning minder meget om de tidligere eksempler. Det returnerer antallet af sekunder og mikrosekunder i en flydende datatype.

--Få den samlede tid, SQL Server var inaktiv.VÆLG @@IDLE* CAST(@@TIMETICKS AS Float) Som [IO mikrosekunder]GOSELECT @@IDLE*CAST(@@TIMETICKS AS Float)/1000000 AS [IO Sekunder]Go

Udgangen:

Forstå @@PACK_SENT, @@PACK_RECEIVED og @@PACKET_ERRORS

Disse systemstatistiske funktioner vedrører netværkspakker. De er yderst nyttige til at analysere informationen om netværkspakker.

  • @@PACK_SENT – returnerer antallet af outputpakker skrevet til netværket af SQL Server siden sidste genstart.
  • @@PACK_RECEIVED – viser antallet af inputpakker læst fra netværket af SQL Server siden sidste genstart.
  • @@PACKET_ERRORS – viser antallet af netværkspakkefejl, der er opstået på SQL Server-forbindelser siden sidste genstart.

Vi kan bruge nedenstående T-SQL-sætninger til at få antallet af input- og outputpakker, der skal læses eller skrives af SQL Server.

--Få antallet af pakker modtaget eller sendtSELECT @@PACK_SENT AS [Packets Sendt]GOSELECT @@PACK_RECEIVED AS [Packets RECIEVED]GO 

Detaljerne om disse pakker er i outputtet:

Du kan også køre @@PACKET_ERRORS på samme måde for at få det samlede antal pakkefejl:

--Hent antal pakker ErrorsSELECT @@PACKET_ERRORS 

Forstå @@TOTAL_READ, @@TOTAL_WRITE og @@TOTAL_ERRORS

De diskrelaterede systemstatistiske funktioner får antallet af disklæsninger, diskskrivninger og diskskrivningsfejl, som SQL Server har udført.

  • @@TOTAL_READ – viser antallet af disklæsninger af SQL Server siden sidste genstart.
  • @@TOTAL_WRITE – viser antallet af diskskrivninger fra SQL Server siden sidste genstart.
  • @@TOTAL_ERRORS – viser antallet af diskskrivningsfejl fra SQL Server siden sidste genstart. Husk, ikke-fatale skrivefejl fanges ikke af denne funktion – de håndteres af systemet selv.

Jeg har slået alle 3 systemfunktioner sammen i en T-SQL-sætning for at vise outputtet af dem alle i ét skud:

--Få diskrelateret statistikSELECT @@TOTAL_READ AS [Reads], @@TOTAL_WRITE AS [Writes], @@TOTAL_ERRORS As [Disk Errors] 

Nedenfor kan du se antallet af disklæse-, skrive- og skrivefejl:

Forstå @@CONNECTIONS systemfunktion

Denne systemfunktion viser det samlede antal forsøg på at oprette forbindelse til SQL Server, uanset deres succes siden sidste genstart af SQL Server. Kør nedenstående T-SQL-sætning:

--Hent antallet af forsøg på forbindelseSELECT @@CONNECTIONS AS [Total Connections] 

Nedenstående output viser, at det samlede antal forsøg på forbindelse er 3130 for denne SQL Server-instans. Det betyder ikke, at alle 3130 forsøg var vellykkede.

Alle systemstatistiske funktioner i én T-SQL-erklæring

Vi kan også kombinere alle disse systemfunktioner i en T-SQL-sætning og få et enkelt output for hver systemstatistikværdi. Jeg har forklaret hver af systemfunktionerne separat, fordi disse kan være meget nyttige til dine arbejdsbehov og krav.

Kør nedenstående T-SQL-script for at få output fra alle de beskrevne systemstatistikker i ét skud:

--Få systemstatistikSELECT @@CPU_BUSY*CAST (@@TIMETICKS As float) Som [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 ) Som [IO Microseconds],@@IDLE*CAST(@@TIMETICKS AS Float)/1000000 AS [IO Seconds],@@PACK_SENT AS [Packets Sendt],@@PACK_RECEIVED AS [Packets RECIEVED],@@TOTAL_READ AS [ Læser], @@TOTAL_WRITE AS [Writes], @@TOTAL_ERRORS Som [Diskfejl],@@CONNECTIONS AS [Total Connections] 

Her er outputtet af ovenstående script, som viser alle statistikrelaterede oplysninger i ét output:

Brug af lagret procedure til at få SQL Server-statistikker

Der er også en dedikeret Microsoft-systemlagret procedure, der giver os mulighed for at se en lignende visning af systemstatistikken . Navnet på denne lagrede procedure er sp_monitor . Den er fremragende til at spore brugen og værdierne for hver SQL Server-statistiktype siden sidst kørt med den samme lagrede procedure

Bemærk:Du skal have rollen sysadmin for at udføre denne lagrede procedure.

Jeg har udført sp_monitor lagret procedure – se, at den vises i en bestemt form som værdi(værdi)-værdi% eller værdi(værdi). Vi kan se cpu_busy output viser som 20(19)-0%. Nu tænker du måske over, hvordan vi kan læse dette output. Læs og forstå nedenstående tabel – den præsenterer forklaringen for begge outputtyper:

Systemparameter Output Fortolkning
Cpu_optaget 20(19)-0 % CPU var optaget 20 sekunder siden SQL Server sidst blev startet\genstartetCPU var optaget 19 sekunder siden sp_monitor var sidste kørsel 0 % af den samlede tid siden sp_monitor var sidste kørsel.
Packets_received 1467(1428) SQL Server har modtaget 1467 pakker siden den sidst blev startet\restartedSQL Server har modtaget 1428 pakker siden sp_monitor blev udført sidste gang.

Konklusion

Nu kan du se, hvordan du får den systemrelaterede statistik for din SQL Server-instans. Systemets funktioner og den lagrede procedure sp_monitor vil være meget effektivt og bekvemt. Gå videre og brug disse T-SQL-koder i dit udviklingsarbejde eller til systemanalyseaktiviteter.

Del venligst denne artikel på dine foretrukne sociale netværk. Og hvis du vil diskutere disse oplysninger og dele dine meninger og tips, er du velkommen til kommentarsektionen.


  1. Sådan får du gårsdagens dato i SQLite

  2. Microsoft annoncerer SQL Server 2012 R2 og SQL Server 2012 R3!

  3. Hvornår kaldes SQLiteOpenHelper onCreate-metoden?

  4. Alt du behøver at vide om kodningsstandarder for SQL-forespørgsler