Published on

March 6, 2023

Compreendendo as Sessões Ativas no SQL Server

Ao solucionar problemas de desempenho no SQL Server, é crucial identificar as declarações SQL em execução no momento e o uso de recursos. Essas informações ajudam a determinar se o banco de dados é a origem do problema e orientam a ação apropriada a ser tomada.

Visualizando as Sessões Ativas

O SQL Server fornece visualizações de gerenciamento do sistema que permitem visualizar as sessões ativas, as declarações SQL e o uso de recursos. Ao consultar essas visualizações, você pode recuperar facilmente as informações necessárias. No entanto, interpretar os resultados pode ser desafiador se você não estiver familiarizado com a forma como eles são medidos.

Consultando as Sessões Ativas no SQL Server

Para recuperar informações sobre as sessões ativas no SQL Server, você pode usar as seguintes visualizações de gerenciamento do sistema:

  • sys.dm_exec_query_stats: Fornece estatísticas sobre a execução da consulta.
  • sys.dm_exec_connections: Contém informações sobre as conexões associadas a cada sessão.
  • sys.dm_exec_sessions: Fornece detalhes sobre cada sessão ativa.

Aqui está um exemplo de consulta que recupera informações sobre as sessões ativas:

SELECT 
   [st].*, 
   [s].[session_id], 
   [s].[original_login_name], 
   [s].[status], 
   [s].[login_time]
FROM (
   SELECT DB_NAME(ISNULL([t].[dbid], 
         (SELECT 
             CAST([value] AS SMALLINT) FROM [sys].[dm_exec_plan_attributes]([st].[plan_handle]) WHERE [attribute] = 'dbid'))) [DatabaseName],
             ISNULL(OBJECT_NAME([t].[objectid], [t].[dbid]),'{AdHocQuery}') [Proc/Func],
             MIN(SUBSTRING([t].[text], ([st].[statement_start_offset]/2)+1, ((CASE [st].[statement_end_offset] WHEN -1 THEN DATALENGTH([t].[text]) ELSE [st].[statement_end_offset] END - [st].[statement_start_offset])/2)+1)) [Text],
             MAX([st].[max_rows]) [Rows],
             SUM([st].[execution_count])/(SELECT MAX(v) FROM (VALUES (DATEDIFF(ss,MIN([st].[creation_time]),GETDATE())), (1)) AS VALUE(v)) [Calls/Sec],
             MAX([st].[max_elapsed_time])/1000000 [TimeSec],
             MAX([st].[max_worker_time])/1000000 [CpuTimeSec],
             MAX([st].[max_logical_reads]+[st].[max_logical_writes])*8/1024/1024 [IOinGB],
             MAX([st].[max_dop]) [DOP],
             MAX([st].[max_reserved_threads])-MAX([st].[max_used_threads]) [ThreadsExceeded],
             (MAX([st].[max_grant_kb])-MAX([st].[max_used_grant_kb]))/1024 [MemoryExceededMb],
             'SELECT [query_plan] FROM [sys].[dm_exec_query_plan](0x'+CONVERT(VARCHAR(MAX),[st].[plan_handle],2)+')' [ViewPlan],
             [st].[sql_handle]
          FROM [sys].[dm_exec_query_stats] [st]
          CROSS APPLY [sys].[dm_exec_sql_text]([st].[sql_handle]) [t]
          GROUP BY [st].[sql_handle], [st].[query_hash], [st].[plan_handle], [t].[dbid], [t].[objectid]) [st]
   INNER JOIN [sys].[dm_exec_connections] [c] ON [c].[most_recent_sql_handle]=[st].[sql_handle]
   INNER JOIN [sys].[dm_exec_sessions] [s] ON [s].[session_id]=[c].[most_recent_session_id]
ORDER BY (
   SELECT MAX(v) 
   FROM (VALUES ([Calls/Sec]), ([TimeSec]), ([CpuTimeSec]), ([IOinGB]), ([DOP]), ([ThreadsExceeded]), ([MemoryExceededMb])) AS VALUE(v)) DESC,
   [s].[login_time];

Interpretando os Resultados

A saída da consulta fornece informações valiosas sobre as sessões ativas no SQL Server. Aqui estão algumas das colunas principais:

  • DatabaseName: O nome do banco de dados onde a consulta está sendo executada.
  • Proc/Func: O nome do procedimento ou função em execução, ou {AdHocQuery} se for uma consulta direta.
  • Text: O texto da declaração atual em execução.
  • Rows: O número de linhas retornadas pela declaração.
  • Calls/Sec: O número de execuções por segundo desde o momento da criação do plano.
  • TimeSec: A duração em segundos que a declaração está em execução.
  • CpuTimeSec: O tempo de CPU em segundos usado pela declaração.
  • IOinGB: A quantidade de E/S em gigabytes para leituras e gravações.
  • DOP: O grau de paralelismo usado pela declaração.
  • ThreadsExceeded: A diferença entre as threads reservadas e as threads usadas. Um valor positivo indica um possível problema com o plano de execução.
  • MemoryExceededMb: A diferença entre o uso de memória esperado e o uso de memória real. Um valor positivo indica um possível problema com o plano de execução.
  • ViewPlan: Uma declaração para visualizar o plano de execução da declaração e identificar áreas para melhorias.
  • Session_id: Um identificador exclusivo para a sessão, que pode ser usado para encerrar a sessão, se necessário.
  • Original_login_name: O nome de usuário da sessão.
  • Status: O status da sessão, seja em execução ou em espera.
  • Login_time: A hora em que a sessão foi criada, o que pode ajudar a identificar sessões em execução prolongada.

Conclusão

Compreender as sessões ativas no SQL Server é essencial para solucionar problemas de desempenho. Ao consultar as visualizações de gerenciamento do sistema apropriadas, você pode obter informações valiosas sobre as declarações SQL em execução no momento e o uso de recursos. A interpretação dos resultados permite identificar possíveis gargalos e tomar as medidas adequadas para otimizar o desempenho do seu banco de dados.

Lembre-se de que analisar planos de execução e otimizar consultas pode ser uma tarefa complexa que requer expertise. É recomendável consultar recursos relevantes e buscar assistência de profissionais experientes para garantir uma sintonia de desempenho eficaz.

Aproveitando o poder das visualizações de gerenciamento do sistema do SQL Server, você pode obter informações valiosas sobre o desempenho do seu banco de dados e tomar decisões informadas para melhorar sua eficiência.

Artigo Atualizado em: 2023-05-01

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.