Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak uzyskać informacje statystyczne programu SQL Server za pomocą funkcji statystycznych systemu?

Często musimy zebrać statystyki systemowe dotyczące uruchomionych instancji SQL Server, takie jak łączna liczba prób połączeń z instancją SQL Server od momentu jej uruchomienia, czas, jaki SQL Server spędził na aktywnych operacjach itp. Microsoft dostarczył nam osobny zestaw funkcje systemowe do pobierania statystyk związanych z systemem. Dzisiaj wyjaśnię takie funkcje statystyczne systemu z przypadkami użycia.

Funkcje statystyki systemu w SQL

Funkcje statystyki systemu są rodzajem funkcji skalarnej zwracającej pojedynczą wartość na wyjściu. Ten dostarcza informacji statystycznych o systemie. Istotną uwagą jest to, że wszystkie funkcje należące do tej kategorii nie zwrócą tych samych danych wyjściowych podczas ich wykonywania. Za każdą egzekucję otrzymujesz inny wynik. Dlatego funkcje statystyczne systemu są niedeterministyczne.

SQL Server ma kilka wbudowanych funkcji statystycznych systemu zwracających statystyki związane z systemem. Poniżej znajduje się lista:

  • @@POŁĄCZENIA
  • @@PACK_RECEIVED
  • @@CPU_ZAJĘTY
  • @@PACK_SENT
  • @@TIMETYKI
  • @@IDLE
  • @@TOTAL_ERRORS
  • @@IO_BUSY
  • @@TOTAL_READ
  • fn_virtualfilestats
  • @@PACKET_ERRORS
  • @@TOTAL_WRITE

Teraz przyjrzyjmy się im głębiej.

Zrozumienie funkcji systemowych @@CPU_BUSY i @@TIMETICKS

@@CPU_BUSY ma kluczowe znaczenie, gdy musimy zrozumieć, ile czasu (w milisekundach) CPU poświęcił na pracę nad operacjami SQL Server. Wynik tej funkcji jest przyrostowy za każdym razem, gdy ją uruchomisz od ostatniego ponownego uruchomienia programu SQL Server. Oznacza to, że dla każdego przebiegu otrzymujemy na wyjściu wartość przyrostową. Zobacz przykład:

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

Wynik:

Zwraca pojedynczą wartość liczbową, co oznacza, że ​​procesor spędził 641 milisekund na uruchamianiu transakcji SQL Server od ostatniego restartu usługi SQL Server.

Teraz wykonajmy prostą instrukcję SELECT. Ponownie uruchomię powyższą instrukcję T-SQL, aby sprawdzić, czy dane wyjściowe są przyrostowe.

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

Wynik:

Uruchommy SELECT @@CPU_BUSY ponownie, aby zobaczyć jego wynik:

Tutaj widzimy przyrostową wartość 653 milisekund w porównaniu z wartością 641 milisekund zwróconą na pierwszym zrzucie ekranu. Dlatego sprawdziliśmy, że te funkcje systemowe zwracają pojedyncze wartości przyrostowe.

Teraz zanurkujmy głębiej. Sprawdzimy, jak używać @@CPU_BUSY w różnych scenariuszach dla naszych wymagań.

Jak wspomniano powyżej, @@CPU_BUSY funkcja systemowa zwraca dane wyjściowe w milisekundach . Jeśli chcesz uzyskać wyniki w mikrosekundach , musisz użyć @@TIMETICKS funkcji podczas wykonywania instrukcji @@CPU_BUSY T-SQL (zobacz poniższe polecenia).

@@TIMETICKS zwraca liczbę mikrosekund na tik .

Tick ​​jest rodzajem zdarzenia planowania, które powoduje uruchomienie harmonogramów. Ilość czasu na tik jest wartością zależną od komputera, którą można pobrać, uruchamiając poniższą instrukcję T-SQL:

--Get @@TIMETICKS output
SELECT @@TIMETICKS

Oto jego wynik:

Użyjemy obu funkcji razem, aby uzyskać dane wyjściowe w mikrosekundach i sekundach:

--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 wykonaniu obu instrukcji T-SQL, możemy zobaczyć wyniki:

Uwaga:jeśli potrzebujesz danych wyjściowych @CPU_BUSY w typie danych zmiennoprzecinkowych , możesz to również zrobić, uruchamiając poniższy zestaw instrukcji:

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

Wynik:

Śmiało i korzystaj z funkcji systemu @@CPU_BUSY i @@TIMETICK zgodnie z potrzebami biznesowymi.

Zrozumienie funkcji systemu @@IO_BUSY

Jak sama nazwa wskazuje, ta funkcja systemowa zwraca całkowity czas w milisekundach, jaki SQL Server spędził na wykonywaniu operacji IO (operacje Input\Output) od ostatniego restartu SQL Server. Wyjście tej funkcji systemowej jest również przyrostowe za każdym razem, gdy ją uruchomisz.

Uruchom poniższą instrukcję T-SQL:

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

Dane wyjściowe na poniższym obrazku to 194 milisekundy.

Możemy również użyć funkcji systemowej @@TIMETICKS, aby uzyskać wartość w mikrosekundach:

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

Oto wynik powyższej instrukcji T-SQL:

Jeśli chcesz uniknąć przepełnienia arytmetycznego podczas konwersji wartości na mikrosekundy za pomocą funkcji systemowej @@TIMETICKS, uruchom poniższe polecenie, aby uzyskać dane wyjściowe w postaci danych zmiennoprzecinkowych, tak jak to zrobiliśmy wcześniej dla funkcji @@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

Zrozumienie funkcji @@IDLE systemu

Ta funkcja systemowa zwraca czas w milisekundach stanu bezczynności programu SQL Server od ostatniego ponownego uruchomienia. Uruchom poniższe polecenie:

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

Oto wynik:

Możesz również użyć funkcji GETDATE() wraz ze wszystkimi powyższymi funkcjami systemowymi, aby uzyskać ich wartość między bieżącym czasem a czasem ponownego uruchomienia SQL Server. Jeśli chcesz uzyskać tę wartość w mikrosekundach, użyj funkcji @@TIMETICKS, jak pokazano dla funkcji @@CPU_BUSY i @@IO_BUSY.

Poniższa instrukcja T-SQL jest bardzo podobna do poprzednich przykładów. Zwraca liczbę sekund i mikrosekund w typie danych zmiennoprzecinkowych.

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

Wynik:

Zrozumienie @@PACK_SENT, @@PACK_RECEIVED i @@PACKET_ERRORS

Te funkcje statystyczne systemu dotyczą pakietów sieciowych. Są niezwykle przydatne w analizie informacji o pakietach sieciowych.

  • @@PACK_SENT – zwraca liczbę pakietów wyjściowych zapisanych do sieci przez SQL Server od ostatniego restartu.
  • @@PACK_RECEIVED – wyświetla liczbę pakietów wejściowych odczytanych z sieci przez SQL Server od ostatniego restartu.
  • @@PACKET_ERRORS – wyświetla liczbę błędów pakietów sieciowych, które wystąpiły podczas połączeń SQL Server od ostatniego restartu.

Możemy użyć poniższych instrukcji T-SQL, aby uzyskać liczbę pakietów wejściowych i wyjściowych do odczytu lub zapisu przez SQL Server.

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

Szczegóły dotyczące tych pakietów znajdują się w danych wyjściowych:

Możesz także uruchomić @@PACKET_ERRORS podobnie, aby uzyskać całkowitą liczbę błędów pakietów:

--Get number of packets Errors
SELECT @@PACKET_ERRORS

Zrozumienie @@TOTAL_READ, @@TOTAL_WRITE i @@TOTAL_ERRORS

Funkcje statystyczne systemu związane z dyskiem pobierają liczbę odczytów dysku, zapisów na dysku i błędów zapisu na dysku, które wykonał SQL Server.

  • @@TOTAL_READ – wyświetla liczbę odczytów dysku przez SQL Server od ostatniego restartu.
  • @@TOTAL_WRITE – wyświetla liczbę zapisów na dysku przez SQL Server od ostatniego restartu.
  • @@TOTAL_ERRORS – wyświetla liczbę błędów zapisu dysku przez SQL Server od ostatniego ponownego uruchomienia. Pamiętaj, że niekrytyczne błędy zapisu nie są przechwytywane przez tę funkcję – są obsługiwane przez sam system.

Umieściłem wszystkie 3 funkcje systemowe w jednej instrukcji T-SQL, aby wyświetlić wyniki ich wszystkich w jednym ujęciu:

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

Poniżej możesz zobaczyć liczbę odczytów, zapisów i błędów zapisu na dysku:

Zrozumienie funkcji systemu @@CONNECTIONS

Ta funkcja systemowa wyświetla łączną liczbę prób połączenia z SQL Server niezależnie od ich powodzenia od ostatniego ponownego uruchomienia SQL Server. Uruchom poniższą instrukcję T-SQL:

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

Poniższe dane wyjściowe pokazują, że łączna liczba prób połączeń wynosi 3130 dla tego wystąpienia programu SQL Server. Nie oznacza to, że wszystkie 3130 prób zakończyło się sukcesem.

Wszystkie funkcje statystyki systemu w jednej instrukcji T-SQL

Możemy również połączyć wszystkie te funkcje systemowe w jedną instrukcję T-SQL i uzyskać pojedyncze dane wyjściowe dla każdej wartości statystyki systemowej. Wyjaśniłem każdą z funkcji systemu osobno, ponieważ mogą one być bardzo przydatne w przypadku Twoich potrzeb i wymagań związanych z pracą.

Uruchom poniższy skrypt T-SQL, aby za jednym razem uzyskać wszystkie opisane statystyki systemowe:

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

Oto wynik powyższego skryptu, który pokazuje wszystkie informacje związane ze statystykami w jednym wyniku:

Korzystanie z procedury przechowywanej w celu uzyskania statystyk serwera SQL

Istnieje również dedykowana procedura składowana systemu Microsoft, która pozwala nam zobaczyć podobny widok statystyk systemu . Nazwa tej procedury składowanej to sp_monitor . Doskonale nadaje się do śledzenia użycia i wartości każdego typu statystyk SQL Server od ostatniego uruchomienia przez tę samą procedurę składowaną

Uwaga:aby wykonać tę procedurę składowaną, musisz mieć rolę administratora systemu.

Wykonałem sp_monitor procedura składowana – zobacz, jak jest wyświetlana w określonej formie, np. wartość(wartość)-wartość% lub wartość(wartość). Widzimy cpu_busy wyjście pokazujące się jako 20(19)-0%. Teraz możesz pomyśleć o tym, jak możemy odczytać ten wynik. Przeczytaj i zrozum poniższą tabelę – przedstawia ona wyjaśnienia dla obu typów wyjść:

Parametr systemowy Wyjście Interpretacja
Cpu_zajęty 20(19)-0% CPU był zajęty 20 sekund od ostatniego uruchomienia SQL Server\restartedCPU był zajęty 19 sekund od ostatniego uruchomienia sp_monitor0% całkowitego czasu od ostatniego uruchomienia sp_monitor.
Otrzymane pakiety 1467(1428) SQL Server odebrał 1467 pakietów od ostatniego uruchomienia\restartedSQL Server odebrał 1428 pakietów od ostatniego wykonania sp_monitor.

Wniosek

Teraz możesz zobaczyć, jak uzyskać statystyki związane z systemem dla Twojej instancji SQL Server. Funkcje systemu i procedura składowana sp_monitor będzie bardzo wydajny i wygodny. Śmiało i używaj tych kodów T-SQL w swojej pracy programistycznej lub do działań związanych z analizą systemu.

Udostępnij ten artykuł w swoich ulubionych sieciach społecznościowych. A jeśli chcesz omówić te informacje i podzielić się swoimi opiniami i wskazówkami, zapraszamy do sekcji Komentarze.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak działa funkcja STRING_ESCAPE() w SQL Server (T-SQL)

  2. Napraw komunikat 8116 „Data typu danych argumentu jest nieprawidłowa dla argumentu 1 funkcji podciągu” w SQL Server

  3. Podziel wartość jednej kolumny na wartości wielu kolumn

  4. Skryptuj wszystkie dane z bazy danych SQL Server

  5. Wymień SQL Server, usuń wszystko po określonym znaku