Série DMV 1–Conexão, Sessão e Requisição

Posted on setembro 5, 2012

1


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 AS TipoStatus,

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

        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.

image

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

image

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

image

(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 o most_recent_sql_handle e retornar assim o comando executado.

 

SELECT *

FROM sys.dm_exec_sql_text(0x010004001BAEFA10401EDF2B020000000000000000000000)

image

(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

 

image

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

 

image

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

image

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

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