#ChateadaDMV

Há um tempo fiz uma rotina aqui no meu trabalho onde havia a necessidade de listar as transações aberta há mais de x horas. O objetivo dessa rotina é simplesmente listar as transações não sendo necessário eliminá-las, pois para isso há a necessidade de uma análise mais detalhada do caso. Como é uma rotina nova a decisão foi não usar a sysprocesses e assim foi. Conseguimos montar essa query direitinho usando os seguintes DMO’s (Dynamic Management Objects).

  • sys.dm_exec_sessions;
  • sys.dm_tran_session_transactions;
  • sys.dm_tran_active_transactions;
  • sys.dm_exec_sql_text;
  • sys.dm_exec_requests.

A partir disso eu precisava recuperar as seguintes informações:

  • Id da sessão;
  • Nome do servidor de banco de dados;
  • Nome da aplicação;
  • Quantidade de transações abertas;
  • Nome do servidor de origem;
  • Nome do Login;
  • Status da sessão;
  • Hora de início da transação;
  • Query executada pela transação.

Com isso o relatório ficou com a seguinte aparência:

CamposRelatório=1

Com a versão beta do relatório, percebemos que o campo “Qtd Transações” o valor era sempre 1. Ops! Aqui tem algo errado!!!

Como estávamos pegando essa informação pelo campo “open_transaction_count” da DMV sys.dm_exec_requests e a sua característica é “Número de transações abertas para esta requisição.” esse valor realmente estava correto, porém não era isso que eu precisava.

Como minha versão de produção é SQL Server 2008 R2, não tive o que fazer… Fui obrigada a usar a sysprocesses recuperando esse valor do campo “open_tran” que tem a seguinte característica “Número de transações para o processo”.

Nesse último SQLSaturday (#SQLSat325) assisti uma palestra que falava justamente de DMVs e no final tive a oportunidade de questionar sobre isso, pois isso me faz ficar presa a bendita sysprocesses. A resposta foi dizer que o campo “open_transaction_count” existe na sys.dm_exec_session também.

Ao chegar em Brasília e ver mais um WebCast sobre DMVs foi comentado sobre o mesmo assunto onde foi informado que na versão do SQL Server 2008 R2 não era tão simples recuperar essa informação. Então olhando nas documentações da sys.dm_exec_session encontramos o seguinte:

SysSessions

Fazendo o select no 2008 R2 temos o seguinte:

SLServer2008R2-3

Fazendo o mesmo select nas versões 2012 + temos o seguinte:

SLServer2012-4

Ou seja, infelizmente ainda ficarei dependente da sysprocesses.

#Chateada

Link adicional: http://sqlblog.com/blogs/kalen_delaney/archive/2008/06/29/why-i-still-need-sysprocesses.aspx

4 comentários sobre “#ChateadaDMV

  1. Hahahaha #Chateada Muito bom!
    É…infelizmente ainda usaremos a sysprocesses no 2008R2.
    Dependendo da aplicação, então… vou ficar no 2008R2 por muito tempo…

    Mas anime-se e gogo hekaton!

Deixar mensagem para nanelp Cancelar resposta