sql >> Database >  >> RDS >> Sqlserver

Informatie over SQL Server-statistieken verkrijgen met behulp van statistische systeemfuncties

Vaak moeten we systeemstatistieken verzamelen met betrekking tot het uitvoeren van SQL Server-instanties, zoals het aantal totale verbindingen dat is geprobeerd met de SQL Server-instantie sinds de start, of de tijd die SQL Server heeft besteed aan actieve bewerkingen, enz. Microsoft bracht ons een aparte set van systeemfuncties om de systeemgerelateerde statistieken op te halen. Vandaag ga ik dergelijke statistische systeemfuncties uitleggen aan de hand van de gebruiksscenario's.

Statistische systeemfuncties in SQL

Statistische systeemfuncties zijn een soort scalaire functie die een enkele waarde in de uitvoer retourneert. Deze geeft statistische informatie over het systeem. Een essentiële opmerking is dat alle functies die onder deze categorie vallen, niet dezelfde uitvoer zullen retourneren wanneer u ze uitvoert. Voor elke uitvoering krijg je een ander resultaat. Daarom zijn statistische systeemfuncties niet-deterministisch.

SQL Server heeft verschillende ingebouwde statistische systeemfuncties die de systeemgerelateerde statistieken retourneren. Hieronder is de lijst:

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

Laten we ze nu dieper onderzoeken.

Begrijpen van @@CPU_BUSY en @@TIMETICKS systeemfuncties

@@CPU_BUSY is cruciaal wanneer we moeten begrijpen hoeveel tijd in milliseconden de CPU heeft besteed aan het werken aan SQL Server-bewerkingen. Het resultaat van deze functie is incrementeel elke keer dat u deze uitvoert sinds de laatste herstart van SQL Server. Het betekent dat we voor elke run een incrementele waarde in de uitvoer krijgen. Zie het voorbeeld:

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

De uitvoer:

Het retourneert een enkele numerieke waarde, wat betekent dat de CPU 641 milliseconden heeft besteed aan het uitvoeren van de SQL Server-transacties sinds de laatste herstart van de SQL Server-service.

Laten we nu een eenvoudige SELECT-instructie uitvoeren. Ik zal de bovenstaande T-SQL-instructie opnieuw uitvoeren om te controleren of de uitvoer incrementeel is.

--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]

De uitvoer:

Laten we SELECT @@CPU_BUSY uitvoeren nogmaals om de uitvoer te zien:

Hier kunnen we een incrementele waarde van 653 milliseconden zien in vergelijking met de waarde van 641 milliseconden die in de eerste schermafbeelding wordt geretourneerd. Daarom hebben we gevalideerd dat deze systeemfuncties enkele incrementele waarden retourneren.

Laten we nu dieper duiken. We gaan na hoe @@CPU_BUSY . te gebruiken in verschillende scenario's voor onze vereisten.

Zoals hierboven vermeld, de @@CPU_BUSY systeemfunctie retourneert uitvoer in milliseconden . Als u de uitvoer in microseconden wilt krijgen , moet u de @@TIMETICKS . gebruiken functie tijdens het uitvoeren van de @@CPU_BUSY T-SQL-instructie (zie de onderstaande opdrachten).

@@TIMETICKS geeft het aantal microseconden per tik .

Tick ​​is een soort planningsgebeurtenis die ervoor zorgt dat de planners worden uitgevoerd. De hoeveelheid tijd per tik is de computerafhankelijke waarde die kan worden opgehaald door het onderstaande T-SQL-statement uit te voeren:

--Get @@TIMETICKS output
SELECT @@TIMETICKS

Hier is de uitvoer:

We zullen beide functies samen gebruiken om hun output in microseconden en seconden te krijgen:

--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 

Na het uitvoeren van beide T-SQL-statements, kunnen we de output zien:

Opmerking:als u een vereiste hebt om de @CPU_BUSY-uitvoer in een float-gegevenstype te krijgen , kunt u het ook voor elkaar krijgen door de onderstaande reeks instructies uit te voeren:

--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

De uitvoer:

Ga je gang en gebruik de @@CPU_BUSY &@@TIMETICK-systeemfuncties volgens je zakelijke behoeften.

Begrijpen van @@IO_BUSY-systeemfunctie

Zoals de naam al doet vermoeden, retourneert deze systeemfunctie de totale tijd in milliseconden die de SQL Server heeft besteed aan het uitvoeren van IO-bewerkingen (Input\Output-bewerkingen) sinds de laatste herstart van SQL Server. De uitvoer van deze systeemfunctie is ook incrementeel elke keer dat u deze uitvoert.

Voer de onderstaande T-SQL-instructie uit:

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

De output in de onderstaande afbeelding is 194 milliseconden.

We kunnen ook de @@TIMETICKS-systeemfunctie gebruiken om de waarde in microseconden te krijgen:

--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]

Hier is de uitvoer van het bovenstaande T-SQL-statement:

Als u rekenkundige overloop wilt voorkomen terwijl u de waarde naar microseconden converteert met behulp van de @@TIMETICKS-systeemfunctie, voert u de onderstaande opdracht uit om de uitvoer in een float-gegevenstype te krijgen, zoals we eerder hebben gedaan voor de @@CPU_BUSY-functie:

--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

Begrijpen van @@IDLE-systeemfunctie

Deze systeemfunctie retourneert de tijd in milliseconden voor de inactieve status van SQL Server sinds de laatste herstart. Voer het onderstaande commando uit:

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

Hier is de uitvoer:

U kunt ook de GETDATE()-functie samen met alle bovenstaande systeemfuncties gebruiken om hun waarde te krijgen tussen de huidige tijd en de tijd waarop SQL Server opnieuw is opgestart. Als u deze waarde in microseconden wilt krijgen, gebruikt u de functie @@TIMETICKS zoals weergegeven voor de functies @@CPU_BUSY en @@IO_BUSY.

De onderstaande T-SQL-instructie lijkt veel op de vorige voorbeelden. Het geeft het aantal seconden en microseconden terug in een float-gegevenstype.

--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

De uitvoer:

Begrijpen van @@PACK_SENT, @@PACK_RECEIVED en @@PACKET_ERRORS

Deze statistische systeemfuncties hebben betrekking op netwerkpakketten. Ze zijn uiterst nuttig bij het analyseren van de informatie over netwerkpakketten.

  • @@PACK_SENT – geeft het aantal uitvoerpakketten terug dat door SQL Server naar het netwerk is geschreven sinds de laatste herstart.
  • @@PACK_RECEIVED – geeft het aantal invoerpakketten weer dat door SQL Server van het netwerk is gelezen sinds de laatste herstart.
  • @@PACKET_ERRORS – geeft het aantal netwerkpakketfouten weer dat is opgetreden op SQL Server-verbindingen sinds de laatste herstart.

We kunnen de onderstaande T-SQL-instructies gebruiken om het aantal invoer- en uitvoerpakketten te krijgen dat door SQL Server moet worden gelezen of geschreven.

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

De details over deze pakketten staan ​​in de uitvoer:

U kunt ook @@PACKET_ERRORS . uitvoeren op dezelfde manier om het totale aantal pakketfouten te krijgen:

--Get number of packets Errors
SELECT @@PACKET_ERRORS

Inzicht in @@TOTAL_READ, @@TOTAL_WRITE en @@TOTAL_ERRORS

De schijfgerelateerde statistische systeemfuncties halen het aantal schijflezingen, schijfschrijffouten en schijfschrijffouten op die SQL Server heeft uitgevoerd.

  • @@TOTAL_READ – geeft het aantal schijflezen weer door SQL Server sinds de laatste herstart.
  • @@TOTAL_WRITE – geeft het aantal schijfschrijfbewerkingen weer door SQL Server sinds de laatste herstart.
  • @@TOTAL_ERRORS – geeft het aantal schijfschrijffouten weer door SQL Server sinds de laatste herstart. Onthoud dat niet-fatale schrijffouten niet worden opgevangen door deze functie - ze worden afgehandeld door het systeem zelf.

Ik heb alle 3 systeemfuncties in één T-SQL-statement gebundeld om de uitvoer van ze allemaal in één keer weer te geven:

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

Hieronder ziet u het aantal schijflees-, schrijf- en schrijffouten:

Begrijpen van @@CONNECTIONS Systeemfunctie

Deze systeemfunctie toont het totale aantal pogingen om verbinding te maken met SQL Server, ongeacht het succes sinds de laatste herstart van SQL Server. Voer de onderstaande T-SQL-instructie uit:

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

De onderstaande uitvoer laat zien dat het totale aantal pogingen tot verbinding 3130 is voor dit SQL Server-exemplaar. Het betekent niet dat alle 3130 pogingen succesvol waren.

Alle statistische systeemfuncties in één T-SQL-statement

We kunnen ook al deze systeemfuncties combineren in één T-SQL-instructie en een enkele uitvoer krijgen voor elke systeemstatistiekenwaarde. Ik heb elk van de systeemfuncties afzonderlijk uitgelegd, omdat deze erg handig kunnen zijn voor uw werkbehoeften en -vereisten.

Voer het onderstaande T-SQL-script uit om de uitvoer van alle beschreven systeemstatistieken in één keer te krijgen:

--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]

Hier is de uitvoer van het bovenstaande script dat alle statistische informatie in één uitvoer toont:

Opgeslagen procedure gebruiken om SQL Server-statistieken op te halen

Er is ook een speciale opgeslagen procedure in het Microsoft-systeem waarmee we een vergelijkbare weergave van de systeemstatistieken kunnen zien . De naam van deze opgeslagen procedure is sp_monitor . Het is uitstekend geschikt voor het bijhouden van het gebruik en de waarden van elk type SQL Server-statistieken sinds de laatste keer dat het volgens dezelfde opgeslagen procedure is uitgevoerd

Opmerking:u moet de rol sysadmin hebben om deze opgeslagen procedure uit te voeren.

Ik heb de sp_monitor . uitgevoerd opgeslagen procedure - zie dat het wordt weergegeven in een specifieke vorm zoals value(value)-value% of waarde(waarde). We kunnen de cpu_busy . zien uitvoer weergegeven als 20(19)-0%. Nu zou je kunnen nadenken over hoe we deze uitvoer kunnen lezen. Lees en begrijp de onderstaande tabel – deze geeft de uitleg voor beide outputtypes:

Systeemparameter Uitvoer Interpretatie
Cpu_busy 20(19)-0% CPU was 20 seconden bezig sinds SQL Server voor het laatst werd gestart\restartedCPU was 19 seconden bezig sinds sp_monitor de laatste run was 0% van de totale tijd sinds sp_monitor de laatste run was.
Packets_received 1467(1428) SQL Server heeft 1467 pakketten ontvangen sinds het voor het laatst is gestart\restartedSQL Server heeft 1428 pakketten ontvangen sinds sp_monitor de laatste keer werd uitgevoerd.

Conclusie

Nu kunt u zien hoe u de systeemgerelateerde statistieken voor uw SQL Server-instantie kunt krijgen. De systeemfuncties en opgeslagen procedure sp_monitor zal zeer efficiënt en handig zijn. Ga je gang en gebruik deze T-SQL-codes in je ontwikkelingswerk of voor systeemanalyse-activiteiten.

Deel dit artikel op uw favoriete sociale netwerken. En als u deze informatie wilt bespreken en uw mening en tips wilt delen, bent u welkom in het gedeelte Opmerkingen.


  1. ExecuteBatch-methode retourneert array met waarde -2 in java

  2. De standaard bestandslocatie voor gegevensbestanden en logbestanden in SQL Server vinden

  3. 5 fouten bij het ontwerpen van databases die u moet vermijden

  4. SQL-query om de laatste dag van de maand te vinden