SQL Server - Conexão, Sessão e Requisição

Luan Moreno

Dn747212.060DE5057573180CEC6D227C6D3E2207(pt-br,TechNet.10).png

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.

Dn747212.3E0D5F5FFC2AB7DA2F4B459700C72BD8(pt-br,TechNet.10).png

(Figura 1 – Conexões e Sessões Parte 1.)

Dn747212.39F6115B7FD15BFF9DEDED352E8F7188(pt-br,TechNet.10).png

(Figura 2 – Conexões e Sessões Parte 2.)

Dn747212.FCB0FCAE807FAA21135B918D43CC814F(pt-br,TechNet.10).png

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

Dn747212.BAA50249FFA336B98EB9B53116A2E31B(pt-br,TechNet.10).png

(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

Dn747212.8F6DD4AE14ACB094B65A333CAFD96CC8(pt-br,TechNet.10).png

(Figura 5 – Requisições Parte 1.)

Dn747212.4E9D561D49C32D539DB671DBA7FB72D7(pt-br,TechNet.10).png

(Figura 6 – Requisições Parte 2.)

Dn747212.3E4B9333F5978F05809299777DAC1D0F(pt-br,TechNet.10).png

(Figura 7 – Requisições Parte 3.)

Assim conseguimos saber mais claramente o que acontece com nossa instância de banco de dados.

| Home | Artigos Técnicos | Comunidade