Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como obter informações estatísticas do SQL Server usando funções estatísticas do sistema


Muitas vezes, precisamos coletar estatísticas do sistema sobre a execução de instâncias do SQL Server, como o número total de conexões tentadas à instância do SQL Server desde o início ou o tempo que o SQL Server gastou em operações ativas etc. A Microsoft nos trouxe um conjunto separado de funções do sistema para recuperar as estatísticas relacionadas ao sistema. Hoje, vou explicar essas funções estatísticas do sistema com os casos de uso.

Funções estatísticas do sistema em SQL


As funções estatísticas do sistema são um tipo de função escalar que retorna um único valor na saída. Este fornece informações estatísticas sobre o sistema. Uma observação essencial é que todas as funções que se enquadram nessa categoria não retornarão a mesma saída quando você as executar. Para cada execução, você obtém um resultado diferente. É por isso que as funções estatísticas do sistema não são determinísticas.

O SQL Server tem várias funções estatísticas do sistema integradas que retornam as estatísticas relacionadas ao sistema. Abaixo segue a lista:
  • @@CONEXÕES
  • @@PACK_RECEIVED
  • @@CPU_BUSY
  • @@PACK_SENT
  • @@TIMETICKS
  • @@IDLE
  • @@TOTAL_ERRORS
  • @@IO_BUSY
  • @@TOTAL_READ
  • fn_virtualfilestats
  • @@PACKET_ERRORS
  • @@TOTAL_WRITE

Agora, vamos explorá-los mais profundamente.

Compreendendo as funções do sistema @@CPU_BUSY e @@TIMETICKS


@@CPU_BUSY é crucial quando precisamos entender quanto tempo em milissegundos a CPU gastou trabalhando nas operações do SQL Server. O resultado dessa função é incremental toda vez que você a executa desde a última reinicialização do SQL Server. Isso significa que, para cada execução, obtemos um valor incremental na saída. Veja o exemplo:
--Execute below T-SQL to get how busy your CPU is
SELECT @@CPU_BUSY

A saída:

Ele retorna um único valor numérico, o que significa que a CPU gastou 641 milissegundos na execução das transações do SQL Server desde a última reinicialização do serviço SQL Server.

Agora, vamos executar uma instrução SELECT simples. Vou executar a instrução T-SQL acima novamente para verificar se a saída é incremental.
--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]

A saída:

Vamos executar SELECT @@CPU_BUSY novamente para ver sua saída:

Aqui, podemos ver um valor incremental de 653 milissegundos em comparação com o valor de 641 milissegundos retornado na primeira captura de tela. Portanto, validamos que essas funções do sistema retornam valores incrementais únicos.

Agora, vamos mergulhar mais fundo. Vamos verificar como usar @@CPU_BUSY em vários cenários para nossos requisitos.

Conforme declarado acima, o @@CPU_BUSY a função do sistema retorna a saída em milissegundos . Se você deseja obter sua saída em microssegundos , você precisa usar o @@TIMETICKS ao executar a instrução T-SQL @@CPU_BUSY (veja os comandos abaixo).

@@TIMETICKS retorna o número de microssegundos por tick .

Tick ​​é um tipo de evento de agendamento que faz com que os agendadores sejam executados. A quantidade de tempo por tick é o valor dependente do computador que pode ser obtido executando a instrução T-SQL abaixo:
--Get @@TIMETICKS output
SELECT @@TIMETICKS

Aqui está sua saída:

Usaremos as duas funções juntas para obter sua saída em microssegundos e segundos:
--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 

Depois de executar ambas as instruções T-SQL, podemos ver as saídas:

Nota:Se você tiver um requisito para obter a saída @CPU_BUSY em um tipo de dados float , você também pode fazer isso executando o conjunto de instruções abaixo:
--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

A saída:

Vá em frente e use as funções do sistema @@CPU_BUSY &@@TIMETICK conforme sua necessidade de negócios.

Compreendendo a função do sistema @@IO_BUSY


Como o próprio nome sugere, essa função do sistema retorna o tempo total em milissegundos que o SQL Server gastou executando operações de E/S (operações de entrada/saída) desde a última reinicialização do SQL Server. A saída desta função do sistema também é incremental toda vez que você a executa.

Execute a instrução T-SQL abaixo:
--Get total time SQL Server has taken in IO operations since its last restart
SELECT @@IO_BUSY

A saída na imagem abaixo é de 194 milissegundos.

Também podemos usar a função do sistema @@TIMETICKS para obter o valor em microssegundos:
--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]

Aqui está a saída da instrução T-SQL acima:

Se você quiser evitar estouro aritmético ao converter o valor em microssegundos usando a função de sistema @@TIMETICKS, execute o comando abaixo para obter sua saída em um tipo de dados float, como fizemos para a função @@CPU_BUSY anteriormente:
--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

Compreendendo a função do sistema @@IDLE


Essa função do sistema retorna o tempo em milissegundos para o status ocioso do SQL Server desde a última reinicialização. Execute o comando abaixo:
--Get total time SQL Server was idle
SELECT @@IDLE

Aqui está a saída:

Você também pode usar a função GETDATE() junto com todas as funções do sistema acima para obter seu valor entre a hora atual e a hora em que o SQL Server foi reiniciado. Se você deseja obter esse valor em microssegundos, use a função @@TIMETICKS conforme mostrado para as funções @@CPU_BUSY e @@IO_BUSY.

A instrução T-SQL abaixo é muito semelhante aos exemplos anteriores. Ele retorna o número de segundos e microssegundos em um tipo de dados 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

A saída:

Compreendendo @@PACK_SENT, @@PACK_RECEIVED e @@PACKET_ERRORS


Essas funções estatísticas do sistema estão relacionadas a pacotes de rede. Eles são extremamente úteis na análise das informações dos pacotes de rede.
  • @@PACK_SENT – retorna o número de pacotes de saída gravados na rede pelo SQL Server desde a última reinicialização.
  • @@PACK_RECEIVED – exibe o número de pacotes de entrada lidos da rede pelo SQL Server desde a última reinicialização.
  • @@PACKET_ERRORS – exibe o número de erros de pacote de rede que ocorreram nas conexões do SQL Server desde a última reinicialização.

Podemos usar as instruções T-SQL abaixo para obter o número de pacotes de entrada e saída a serem lidos ou gravados pelo SQL Server.
--Get the number of packets received or sent
SELECT @@PACK_SENT AS [Packets Sent]
GO
SELECT @@PACK_RECEIVED AS [Packets RECIEVED]
GO

Os detalhes sobre esses pacotes estão na saída:

Você também pode executar @@PACKET_ERRORS da mesma forma para obter o número total de erros de pacote:
--Get number of packets Errors
SELECT @@PACKET_ERRORS

Compreendendo @@TOTAL_READ, @@TOTAL_WRITE e @@TOTAL_ERRORS


As funções estatísticas do sistema relacionadas ao disco obtêm o número de leituras de disco, gravações de disco e erros de gravação de disco que o SQL Server executou.
  • @@TOTAL_READ – exibe o número de leituras de disco pelo SQL Server desde a última reinicialização.
  • @@TOTAL_WRITE – exibe o número de gravações em disco pelo SQL Server desde a última reinicialização.
  • @@TOTAL_ERRORS – exibe o número de erros de gravação de disco pelo SQL Server desde a última reinicialização. Lembre-se, erros de gravação não fatais não são capturados por esta função – eles são tratados pelo próprio sistema.

Eu juntei todas as 3 funções do sistema em uma instrução T-SQL para exibir a saída de todas elas de uma só vez:
--Get Disk related statistics
SELECT @@TOTAL_READ AS [Reads], 
@@TOTAL_WRITE AS [Writes], 
@@TOTAL_ERRORS As [Disk Errors]

Abaixo, você pode ver o número de leituras, gravações e erros de gravação de disco:

Compreendendo a função do sistema @@CONNECTIONS


Essa função do sistema exibe o número total de tentativas de conexão ao SQL Server, independentemente de seu sucesso, desde a última reinicialização do SQL Server. Execute a instrução T-SQL abaixo:
--Get the number of attempted connections
SELECT @@CONNECTIONS AS [Total Connections]

A saída abaixo mostra que o número total de tentativas de conexão é 3130 para esta instância do SQL Server. Isso não significa que todas as 3130 tentativas foram bem-sucedidas.

Todas as funções estatísticas do sistema em uma instrução T-SQL


Também podemos combinar todas essas funções do sistema em uma instrução T-SQL e obter uma única saída para cada valor de estatística do sistema. Expliquei cada uma das funções do sistema separadamente porque elas podem ser muito úteis para suas necessidades e requisitos de trabalho.

Execute o script T-SQL abaixo para obter a saída de todas as estatísticas do sistema descritas de uma só vez:
--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]

Aqui está a saída do script acima que mostra todas as informações relacionadas a estatísticas em uma saída:

Usando o procedimento armazenado para obter estatísticas do SQL Server


Há também um procedimento armazenado do sistema Microsoft dedicado que nos permite ver uma visão semelhante das estatísticas do sistema . O nome deste procedimento armazenado é sp_monitor . É excelente para rastrear os usos e valores de cada tipo de estatística do SQL Server desde a última execução pelo mesmo procedimento armazenado

Observação:você precisa ter a função sysadmin para executar este procedimento armazenado.

Eu executei o sp_monitor procedimento armazenado - veja se está aparecendo em um formulário específico como value(value)-value% ou valor(valor). Podemos ver o cpu_busy saída mostrando como 20(19)-0%. Agora, você pode pensar em como podemos ler essa saída. Leia e entenda a tabela abaixo – ela apresenta a explicação para ambos os tipos de saída:
Parâmetro do sistema Saída Interpretação
Cpu_ocupado 20(19)-0% A CPU estava ocupada 20 segundos desde a última inicialização do SQL Server\restartedCPU estava ocupada 19 segundos desde que sp_monitor foi a última execução 0% do tempo total desde que sp_monitor foi a última execução.
Pacotes_recebidos 1467(1428) O SQL Server recebeu 1467 pacotes desde que foi iniciado pela última vez\restartedSQL Server recebeu 1428 pacotes desde a última execução de sp_monitor.

Conclusão


Agora você pode ver como obter as estatísticas relacionadas ao sistema para sua instância do SQL Server. As funções do sistema e o procedimento armazenado sp_monitor será muito eficiente e conveniente. Vá em frente e use esses códigos T-SQL em seu trabalho de desenvolvimento ou para atividades de análise de sistema.

Por favor, compartilhe este artigo em suas redes sociais favoritas. E se você quiser discutir essas informações e compartilhar suas opiniões e dicas, você é bem-vindo à seção de Comentários.