SQL Server - Conexão, Sessão e Requisição
Luan Moreno
Maio, 2014
Introdução
Quando trabalhamos com investigação, análise de desempenho, verificação de configurações, visualização de índices ou seja, tudo relacionado a informações globais do servidor de banco de dados, temos a DMV’s (Dynamic Management View’s) como nossas aliadas.
Uma das partes nas quais podemos trabalhar é com Conexões, Sessões e Requisições. As conexões são quem realiza a entrada a instância do banco de dados, as sessões são as informações que são geradas a partir da conexão, e as requisições são as execuções que as sessões estão sendo realizadas naquele determinado momento.
DMV’s (Dynamic Management View’s)
Em relação a esse conjunto de DMV’s acima trabalhamos principalmente com as seguintes:
sys.dm_exec_connections = Informações referentes a tráfico de rede e protocolos, assim como os atributos da conexão de entrada dentro da instância do banco de dados.
sys.dm_exec_sessions = Mostra informações internas das sessões dentro dos bancos de dados assim como informações de segurança, acúmulo de CPU e memória assim como utilização de I/O.
sys.dm_exec_requests = Nesta parte é mostrada todas as informações pertinentes a estatísticas de execução da consulta, tempo de duração, tipo de WAIT TYPE, tempo gasto de CPU dentre outros.
sys.dm_exec_sql_text = Com essa DMV é possível retornar o texto da consulta que podemos visualizar na DMV acima pelo campo SQL_HANDLE.
sys.dm_exec_query_plan = Retorna em XML o plano da consulta desejada identificado pelo PLAN_HANDLE.
Conexões e Sessões
Agora para identificarmos todas as sessões e requisições que possuímos dentro da nossa instância do banco de dados, iremos utilizar as DMV’s explicadas acima em conjunto.
USE master
go
;WITH ConnectionsSessions AS
(
SELECT C.session_id,
C.connect_time,
S.login_time,
S.login_name,
C.net_transport,
C.num_reads,
C.last_read,
C.num_writes,
C.last_write,
C.client_net_address,
C.most_recent_sql_handle,
S.status,
CASE WHEN S.status = ‘Running’ THEN ‘Executando Uma ou Mais Requisições’
WHEN S.status = ‘Sleeping’ THEN ‘Executando Sem Requisições’
WHEN S.status = ‘Dormant’ THEN ‘Reiniciada pelo Pool de Conexões’ ELSE S.status END ASTipoStatus,
S.cpu_time,
S.memory_usage,
S.reads,
S.logical_reads,
S.writes,
CASE WHEN S.transaction_isolation_level = 0 THEN ‘Não Especificado’
WHEN S.transaction_isolation_level = 1 THEN ‘Read Uncomitted’
WHEN S.transaction_isolation_level = 2 THEN ‘Read Committed’
WHEN S.transaction_isolation_level = 3 THEN ‘Repeatable’
WHEN S.transaction_isolation_level = 4 THEN ‘Serializable’
WHEN S.transaction_isolation_level = 5 THEN ‘Snapshot’ END AS TipoIsolationLev l,
S.last_request_start_time,
S.last_request_end_time,
program_name
FROM sys.dm_exec_connections AS C
INNER JOIN sys.dm_exec_sessions AS S
ON C.session_id = S.session_id
)
SELECT *
FROM ConnectionsSessions
ORDER BY logical_reads DESC
Assim nos será retornado diversas informações como hora da conexão, nome do login, quantidade de leituras, escritas, sql_handle, status da conexão, nível de isolamento, nome do programa assim como outros.
(Figura 1 – Conexões e Sessões Parte 1.)
(Figura 2 – Conexões e Sessões Parte 2.)
(Figura 3 – Conexões e Sessões Parte 3.)
Tendo isso, podemos mapear qual comando a determinada conexão que possui uma sessão está executando. Utilizando a sys.dm_exec_sql_text podemos comparar com omost_recent_sql_handle e retornar assim o comando executado.
SELECT *
FROM sys.dm_exec_sql_text(0x010004001BAEFA10401EDF2B020000000000000000000000)
(Figura 4 – Informãções de uma determinada consulta.)
Requisições
Se realizarmos um JOIN com a sys.dm_exec_requests iremos retornar somente as consultas que estão sendo realizadas no determinado momento.
SELECT S.*
FROM sys.dm_exec_connections AS C
INNER JOIN sys.dm_exec_requests AS R
ON C.session_id = R.session_id
INNER JOIN sys.dm_exec_sessions AS S
ON S.session_id = R.session_id
(Figura 5 – Requisições Parte 1.)
(Figura 6 – Requisições Parte 2.)
(Figura 7 – Requisições Parte 3.)
Assim conseguimos saber mais claramente o que acontece com nossa instância de banco de dados.