Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да получите статистическа информация за SQL Server с помощта на системни статистически функции

Често се налага да събираме системни статистически данни относно стартирането на екземпляри на SQL Server, като например броя на общите опити за свързване към екземпляра на SQL Server от неговото стартиране или времето, което SQL Server е прекарал в активни операции и т.н. Microsoft ни донесе отделен набор от системни функции за извличане на статистически данни, свързани със системата. Днес ще обясня такива системни статистически функции със случаите на употреба.

Системни статистически функции в SQL

Системните статистически функции са вид скаларна функция, връщаща една стойност в изхода. Това предоставя статистическа информация за системата. Важна забележка е, че всички функции, които попадат в тази категория, няма да върнат същия изход, когато ги изпълните. За всяко изпълнение получавате различен резултат. Ето защо системните статистически функции са недетерминирани.

SQL Server има няколко вградени системни статистически функции, връщащи свързани със системата статистически данни. По-долу е списъкът:

  • @@ВРЪЗКИ
  • @@PACK_RECEIVED
  • @@CPU_BUSY
  • @@PACK_SENT
  • @@TIMETICKS
  • @@IDLE
  • @@TOTAL_ERRORS
  • @@IO_BUSY
  • @@TOTAL_READ
  • fn_virtualfilestats
  • @@PACKET_ERRORS
  • @@TOTAL_WRITE

Сега нека ги проучим по-задълбочено.

Разбиране на @@CPU_BUSY и @@TIMETICKS системните функции

@@CPU_BUSY е от решаващо значение, когато трябва да разберем колко време в милисекунди CPU е прекарал в работа върху операциите на SQL Server. Резултатът от тази функция се увеличава всеки път, когато я стартирате след последното рестартиране на SQL Server. Това означава, че за всяко изпълнение получаваме инкрементална стойност в изхода. Вижте примера:

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

Резултатът:

Той връща една цифрова стойност, което означава, че процесорът е прекарал 641 милисекунди за изпълнение на транзакциите на SQL Server след последното рестартиране на услугата на SQL Server.

Сега нека изпълним прост оператор SELECT. Ще изпълня горния израз на T-SQL отново, за да проверя дали изходът е инкрементален.

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

Резултатът:

Нека изпълним SELECT @@CPU_BUSY отново, за да видите неговия изход:

Тук можем да видим инкрементална стойност от 653 милисекунди в сравнение със стойността от 641 милисекунди, върната в първата екранна снимка. Затова потвърдихме, че тези системни функции връщат единични инкрементални стойности.

Сега, нека се потопим по-дълбоко. Ще проверим как да използваме @@CPU_BUSY в различни сценарии за нашите изисквания.

Както беше посочено по-горе, @@CPU_BUSY системната функция връща изход за милисекунди . Ако искате да получите изхода му за микросекунди , трябва да използвате @@TIMETICKS функция, докато изпълнявате оператора @@CPU_BUSY T-SQL (вижте командите по-долу).

@@TIMETICKS връща броя микросекунди на тик .

Tick ​​е вид събитие за планиране, което кара планировчиците да се изпълняват. Количеството време на тик е зависимата от компютъра стойност, която може да бъде извлечена чрез изпълнение на следния T-SQL оператор:

--Get @@TIMETICKS output
SELECT @@TIMETICKS

Ето неговия изход:

Ще използваме и двете функции заедно, за да получим изхода им за микросекунди и секунди:

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

След като изпълним и двата T-SQL оператора, можем да видим изходите:

Забележка:Ако имате изискване да получите изхода @CPU_BUSY в тип данни с плаващ поток , можете също да го направите, като изпълните по-долу набор от изрази:

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

Резултатът:

Продължете и използвайте системните функции @@CPU_BUSY &@@TIMETICK според нуждите на бизнеса ви.

Разбиране на системната функция @@IO_BUSY

Както подсказва името й, тази системна функция връща общото време в милисекунди, което SQL Server е прекарал в извършване на IO операции (входно\изходни операции) от последното рестартиране на SQL Server. Резултатът от тази системна функция също е инкрементален всеки път, когато я стартирате.

Изпълнете следния T-SQL оператор:

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

Резултатът в изображението по-долу е 194 милисекунди.

Можем също да използваме системната функция @@TIMETICKS, за да получим стойността в микросекунди:

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

Ето изхода на горния израз на T-SQL:

Ако искате да избегнете аритметично преливане, докато преобразувате стойността в микросекунди с помощта на системната функция @@TIMETICKS, изпълнете командата по-долу, за да получите нейния изход в тип данни с плаваща сила, както направихме за функцията @@CPU_BUSY по-рано:

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

Разбиране на системната функция @@IDLE

Тази системна функция връща времето в милисекунди за състоянието на неактивност на SQL Server от последното рестартиране. Изпълнете командата по-долу:

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

Ето изхода:

Можете също да използвате функцията GETDATE() заедно с всички горепосочени системни функции, за да получите тяхната стойност между текущото време и времето, когато SQL Server се рестартира. Ако искате да получите тази стойност в микросекунди, използвайте функцията @@TIMETICKS, както е показано за функциите @@CPU_BUSY и @@IO_BUSY.

T-SQL изявлението по-долу е много подобно на предишните примери. Връща броя секунди и микросекунди в тип данни с плаваща стойност.

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

Резултатът:

Разбиране на @@PACK_SENT, @@PACK_RECEIVED и @@PACKET_ERRORS

Тези системни статистически функции се отнасят до мрежови пакети. Те са изключително полезни при анализиране на информацията за мрежовите пакети.

  • @@PACK_SENT – връща броя на изходните пакети, записани в мрежата от SQL Server след последното рестартиране.
  • @@PACK_RECEIVED – показва броя на входните пакети, прочетени от мрежата от SQL Server след последното рестартиране.
  • @@PACKET_ERRORS – показва броя на грешките в мрежовите пакети, възникнали при връзките на SQL Server след последното рестартиране.

Можем да използваме посочените по-долу T-SQL изрази, за да получим броя на входните и изходните пакети за четене или записване от SQL Server.

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

Подробностите за тези пакети са в изхода:

Можете също да стартирате @@PACKET_ERRORS по подобен начин, за да получите общия брой пакетни грешки:

--Get number of packets Errors
SELECT @@PACKET_ERRORS

Разбиране на @@TOTAL_READ, @@TOTAL_WRITE и @@TOTAL_ERRORS

Свързаните с диска системни статистически функции получават броя на грешките при четене на диск, запис на диск и запис на диск, които SQL Server е извършил.

  • @@TOTAL_READ – показва броя на прочетените дискове от SQL Server след последното рестартиране.
  • @@TOTAL_WRITE – показва броя записи на диск от SQL Server след последното рестартиране.
  • @@TOTAL_ERRORS – показва броя на грешките при запис на диск от SQL Server след последното рестартиране. Не забравяйте, че нефаталните грешки при запис не се улавят от тази функция – те се обработват от самата система.

Свързах всичките 3 системни функции в един израз на T-SQL, за да покажа изхода от всички наведнъж:

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

По-долу можете да видите броя на грешките при четене, запис и запис на диск:

Разбиране на системната функция @@CONNECTIONS

Тази системна функция показва общия брой опити за свързване към SQL Server, независимо от техния успех след последното рестартиране на SQL Server. Изпълнете следния T-SQL оператор:

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

Изходът по-долу показва, че общият брой опити за свързване е 3130 за този екземпляр на SQL Server. Това не означава, че всичките 3130 опита са били успешни.

Всички системни статистически функции в един T-SQL израз

Можем също да комбинираме всички тези системни функции в един T-SQL оператор и да получим един изход за всяка стойност на системната статистика. Обясних всяка от системните функции поотделно, защото те може да са много полезни за вашите работни нужди и изисквания.

Изпълнете следния T-SQL скрипт, за да получите изхода от всички описани системни статистически данни наведнъж:

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

Ето изхода на горния скрипт, който показва цялата информация, свързана със статистиката, в един изход:

Използване на съхранена процедура за получаване на статистика на SQL Server

Има и специална системна съхранена процедура на Microsoft, която ни позволява да видим подобен изглед на системната статистика . Името на тази съхранена процедура е sp_monitor . Той е отличен за проследяване на употребите и стойностите на всеки тип статистика на SQL Server от последното изпълнение от същата съхранена процедура

Забележка:Трябва да имате ролята на системен администратор, за да изпълните тази съхранена процедура.

Изпълних sp_monitor съхранена процедура – ​​вижте, че се показва в конкретна форма като стойност(стойност)-стойност% или стойност(стойност). Можем да видим cpu_busy изход, показващ 20(19)-0%. Сега може да помислите как можем да прочетем този изход. Прочетете и разберете таблицата по-долу – тя представя обяснението и за двата типа изход:

Системен параметър Изход Тълкуване
Cpu_busy 20(19)-0% CPU беше зает 20 секунди от последното стартиране на SQL Server\restartedCPU беше зает 19 секунди, откакто sp_monitor беше последното изпълнение0% от общото време, откакто sp_monitor беше последното изпълнение.
Получени_пакети 1467(1428) SQL сървърът е получил 1467 пакета от последното му стартиране\restartedSQL сървърът е получил 1428 пакета от последния път, когато sp_monitor е бил изпълнен.

Заключение

Сега можете да видите как да получите свързаните със системата статистически данни за вашия екземпляр на SQL Server. Системните функции и съхранената процедура sp_monitor ще бъде много ефективно и удобно. Продължете и използвайте тези T-SQL кодове в работата си по разработката или за дейности по системен анализ.

Моля, споделете тази статия в любимите си социални мрежи. И ако искате да обсъдите тази информация и да споделите вашите мнения и съвети, добре дошли в секцията за коментари.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Принуди Oracle да върне ТОП N реда с SKIP LOCKED

  2. Как да се свържа с база данни MSSQL с помощта на DBI модула на Perl в Windows?

  3. SQL Server Тригер за работа върху множество вмъквания на ред

  4. Отчитане на данни за производителността на SQLDIAG чрез инструмента за RML помощни програми | Отстраняване на проблеми с производителността на SQL Server -7

  5. Кога трябва да използвам начални/крайни блокове и ключовата дума Go в SQL Server?