Často potřebujeme shromáždit systémové statistiky týkající se spouštění instancí SQL Serveru, jako je celkový počet pokusů o připojení k instanci SQL Serveru od jejího spuštění nebo čas, který SQL Server strávil aktivními operacemi atd. Microsoft nám přinesl samostatnou sadu systémové funkce pro načtení statistik souvisejících se systémem. Dnes vysvětlím takové systémové statistické funkce na příkladech použití.
Systémové statistické funkce v SQL
Systémové statistické funkce jsou typem skalární funkce vracející jedinou hodnotu na výstupu. Tento poskytuje statistické informace o systému. Nezbytnou poznámkou je, že všechny funkce, které spadají do této kategorie, nevrátí stejný výstup, když je spustíte. Pro každé provedení získáte jiný výsledek. Proto jsou systémové statistické funkce nedeterministické.
SQL Server má několik vestavěných systémových statistických funkcí, které vracejí statistiky související se systémem. Níže je seznam:
- @@CONNECTIONS
- @@PACK_RECEIVED
- @@CPU_BUSY
- @@PACK_SENT
- @@TIMETICKS
- @@NEČINNÁ
- @@TOTAL_ERRORS
- @@IO_BUSY
- @@TOTAL_READ
- fn_virtualfilestats
- @@PACKET_ERRORS
- @@TOTAL_WRITE
Pojďme je nyní prozkoumat hlouběji.
Vysvětlení systémových funkcí @@CPU_BUSY a @@TIMETICKS
@@CPU_BUSY je zásadní, když potřebujeme pochopit, kolik času v milisekundách CPU strávil prací na operacích SQL Server. Výsledek této funkce je přírůstkový pokaždé, když ji spustíte od posledního restartu SQL Server. To znamená, že pro každý běh dostaneme na výstupu přírůstkovou hodnotu. Viz příklad:
--Execute below T-SQL to get how busy your CPU is
SELECT @@CPU_BUSY
Výstup:
IGmNNT33Ut29870qmNNT33Ut29870qmNNT3Ut29890090wdjpgVrací jedinou číselnou hodnotu, což znamená, že CPU strávil 641 milisekund spuštěním transakcí SQL Serveru od posledního restartu služby SQL Server.
Nyní provedeme jednoduchý příkaz SELECT. Znovu spustím výše uvedený příkaz T-SQL, abych ověřil, zda je výstup přírůstkový.
--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]
Výstup:
Spusťte SELECT @@CPU_BUSY znovu, abyste viděli jeho výstup:
Zde můžeme vidět přírůstkovou hodnotu 653 milisekund ve srovnání s hodnotou 641 milisekund vrácenou na prvním snímku obrazovky. Proto jsme potvrdili, že tyto systémové funkce vracejí jednotlivé přírůstkové hodnoty.
Nyní se ponořme hlouběji. Zkontrolujeme, jak používat @@CPU_BUSY v různých scénářích pro naše požadavky.
Jak je uvedeno výše, @@CPU_BUSY systémová funkce vrací výstup v milisekundách . Pokud chcete získat jeho výstup v mikrosekundách , musíte použít @@TIMETICKS při spuštění příkazu @@CPU_BUSY T-SQL (viz níže uvedené příkazy).
@@TIMETICKS vrátí počet mikrosekund na zaškrtnutí .
Tick je druh plánovací události, která způsobí spuštění plánovačů. Množství času na jeden tick je hodnota závislá na počítači, kterou lze načíst spuštěním následujícího příkazu T-SQL:
--Get @@TIMETICKS output
SELECT @@TIMETICKS
Zde je jeho výstup:
Obě funkce použijeme společně, abychom získali jejich výstup v mikrosekundách a sekundách:
--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
Po provedení obou příkazů T-SQL můžeme vidět výstupy:
Poznámka:Pokud požadujete získat výstup @CPU_BUSY v datovém typu float , můžete to také provést spuštěním níže uvedené sady příkazů:
--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
Výstup:
Pokračujte a používejte funkce systému @@CPU_BUSY &@@TIMETICK podle potřeby vaší firmy.
Porozumění systémové funkci @@IO_BUSY
Jak její název napovídá, tato systémová funkce vrací celkový čas v milisekundách, který SQL Server strávil prováděním IO operací (operace Input\Output) od posledního restartu SQL Server. Výstup této systémové funkce je také přírůstkový pokaždé, když ji spustíte.
Spusťte níže uvedený příkaz T-SQL:
--Get total time SQL Server has taken in IO operations since its last restart
SELECT @@IO_BUSY
Výstup na obrázku níže je 194 milisekund.
Můžeme také použít systémovou funkci @@TIMETICKS k získání hodnoty v mikrosekundách:
--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]
Zde je výstup výše uvedeného příkazu T-SQL:
Pokud se chcete vyhnout aritmetickému přetečení při převodu hodnoty na mikrosekundy pomocí systémové funkce @@TIMETICKS, spusťte níže uvedený příkaz, abyste získali jeho výstup v datovém typu float, jak jsme to udělali pro funkci @@CPU_BUSY dříve:
--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
Vysvětlení funkce @@IDLE systému
Tato systémová funkce vrací čas v milisekundách pro stav nečinnosti serveru SQL Server od posledního restartu. Spusťte níže uvedený příkaz:
--Get total time SQL Server was idle
SELECT @@IDLE
Zde je výstup:
Můžete také použít funkci GETDATE() spolu se všemi výše uvedenými systémovými funkcemi k získání jejich hodnoty mezi aktuálním časem a časem, kdy se SQL Server restartoval. Pokud chcete získat tuto hodnotu v mikrosekundách, použijte funkci @@TIMETICKS, jak je znázorněno pro funkce @@CPU_BUSY a @@IO_BUSY.
Níže uvedený příkaz T-SQL je velmi podobný předchozím příkladům. Vrací počet sekund a mikrosekund v datovém typu float.
--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
Výstup:
Vysvětlení @@PACK_SENT, @@PACK_RECEIVED a @@PACKET_ERRORS
Tyto systémové statistické funkce se týkají síťových paketů. Jsou mimořádně užitečné při analýze informací o síťových paketech.
- @@PACK_SENT – vrací počet výstupních paketů zapsaných do sítě SQL Serverem od posledního restartu.
- @@PACK_RECEIVED – zobrazuje počet vstupních paketů přečtených ze sítě SQL Serverem od posledního restartu.
- @@PACKET_ERRORS – zobrazuje počet chyb síťových paketů, ke kterým došlo u připojení SQL Server od posledního restartu.
Můžeme použít níže uvedené T-SQL příkazy k získání počtu vstupních a výstupních paketů ke čtení nebo zápisu SQL Serverem.
--Get the number of packets received or sent
SELECT @@PACK_SENT AS [Packets Sent]
GO
SELECT @@PACK_RECEIVED AS [Packets RECIEVED]
GO
Podrobnosti o těchto paketech jsou ve výstupu:
Můžete také spustit @@PACKET_ERRORS podobně k získání celkového počtu chyb paketů:
--Get number of packets Errors
SELECT @@PACKET_ERRORS
Vysvětlení @@TOTAL_READ, @@TOTAL_WRITE a @@TOTAL_ERRORS
Systémové statistické funkce týkající se disku získávají počet čtení disku, zápisu na disk a chyb zápisu na disk, které SQL Server provedl.
- @@TOTAL_READ – zobrazuje počet čtení disku SQL Serverem od posledního restartu.
- @@TOTAL_WRITE – zobrazuje počet zápisů na disk SQL Serverem od posledního restartu.
- @@TOTAL_ERRORS – zobrazuje počet chyb zápisu na disk SQL Serverem od posledního restartu. Pamatujte, že tato funkce nezachycuje nezávažné chyby zápisu – řeší je systém sám.
Všechny 3 systémové funkce jsem spojil do jednoho příkazu T-SQL, abych zobrazil jejich výstup najednou:
--Get Disk related statistics
SELECT @@TOTAL_READ AS [Reads],
@@TOTAL_WRITE AS [Writes],
@@TOTAL_ERRORS As [Disk Errors]
Níže vidíte počet chyb čtení, zápisu a zápisu z disku:
Vysvětlení funkce systému @@CONNECTIONS
Tato systémová funkce zobrazuje celkový počet pokusů o připojení k SQL Serveru bez ohledu na jejich úspěšnost od posledního restartu SQL Serveru. Spusťte níže uvedený příkaz T-SQL:
--Get the number of attempted connections
SELECT @@CONNECTIONS AS [Total Connections]
Níže uvedený výstup ukazuje, že celkový počet pokusů o připojení je 3130 pro tuto instanci SQL Server. Neznamená to, že všech 3130 pokusů bylo úspěšných.
Všechny systémové statistické funkce v jednom příkazu T-SQL
Všechny tyto systémové funkce můžeme také zkombinovat do jednoho příkazu T-SQL a získat jeden výstup pro každou hodnotu systémové statistiky. Vysvětlil jsem každou z funkcí systému samostatně, protože mohou být velmi užitečné pro vaše pracovní potřeby a požadavky.
Spuštěním níže uvedeného skriptu T-SQL získáte výstup všech popsaných systémových statistik najednou:
--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]
Zde je výstup výše uvedeného skriptu, který zobrazuje všechny informace související se statistikou v jednom výstupu:
Použití uložené procedury pro získání statistiky SQL Server
K dispozici je také vyhrazená uložená procedura systému Microsoft, která nám umožňuje zobrazit podobný pohled na systémové statistiky . Název této uložené procedury je sp_monitor . Je vynikající pro sledování využití a hodnot každého typu statistik SQL Server od posledního spuštění stejnou uloženou procedurou
Poznámka:Ke spuštění této uložené procedury musíte mít roli správce systému.
Spustil jsem sp_monitor uložená procedura – podívejte se, jak se její výstup zobrazuje ve specifickém tvaru jako value(value)-value% nebo value(value). Vidíme cpu_busy výstup zobrazený jako 20(19)-0 %. Nyní můžete přemýšlet o tom, jak můžeme číst tento výstup. Přečtěte si níže uvedenou tabulku a pochopte ji – obsahuje vysvětlení pro oba typy výstupů:
Systémový parametr | Výstup | Výklad |
Cpu_busy | 20(19)-0 % | CPU byl zaneprázdněn 20 sekund od posledního spuštění SQL Server\restartedCPU byl zaneprázdněn 19 sekund, protože sp_monitor byl naposledy spuštěn 0 % z celkového času od posledního spuštění sp_monitor. |
Packets_received | 1467(1428) | SQL Server přijal 1467 paketů od posledního spuštění\restartedSQL Server přijal 1428 paketů od posledního spuštění sp_monitor. |
Závěr
Nyní můžete vidět, jak získat statistiky související se systémem pro vaši instanci SQL Server. Funkce systému a uložená procedura sp_monitor bude velmi efektivní a pohodlný. Pokračujte a použijte tyto kódy T-SQL ve své vývojové práci nebo pro činnosti systémové analýzy.
Sdílejte prosím tento článek na svých oblíbených sociálních sítích. A pokud chcete o těchto informacích diskutovat a podělit se o své názory a tipy, jste vítáni v sekci Komentáře.