Você está na página 1de 23

Desapegue do SQL Server Profiler!

Use
Extended Events!!!
Ainda continuando a falar sobre Extended Events, na minha opinião ele ainda não
ganhou a atenção que deveriam, por isso resolvi montar este post gerando um
comparativo entre eles e o SQL Server Profiler. De acordo com o Books Online do
produto, o SQL Server Profiler está marcado como “deprecated” porque pode ser
totalmente substituído (com vantagens) pelos eventos estendidos.

Mapeando eventos entre o SQL Server Profiler e Extended Events...

Bom, para facilitar nossa vida, a partir do SQL Server 2012 surgiram algumas DMV’s
relacionadas a Extended Events que se combinadas podem nos dar uma informação
muito útil, quais eventos gerados pelo SQL Server Profiler são equivalentes aos eventos
gerados pelo Extended Events, não precisamos escrever o script pois ele já existe
oficialmente, abaixo está o mesmo e o link onde obtê-lo:

USE MASTER;
GO
SELECT DISTINCT
tb.trace_event_id,
te.name AS 'Event Class',
em.package_name AS 'Package',
em.xe_event_name AS 'XEvent Name',
tb.trace_column_id,
tc.name AS 'SQL Trace Column',
am.xe_action_name as 'Extended Events action'
FROM (sys.trace_events te LEFT OUTER JOIN sys.trace_xe_event_map em
ON te.trace_event_id = em.trace_event_id) LEFT OUTER JOINsys.trace_event_bindi
ngs tb
ON em.trace_event_id = tb.trace_event_id LEFT OUTER JOINsys.trace_columns tc
ON tb.trace_column_id = tc.trace_column_id LEFT OUTER JOINsys.trace_xe_actio
n_map am
ON tc.trace_column_id = am.trace_column_id
ORDER BY te.name, tc.name

FONTE: http://msdn.microsoft.com/en-us/library/ff878264.aspx

Ao rodar este script, veremos algo similar ao que esta na imagem abaixo:

A coluna “Event Class”, diz respeito ao nome do evento no SQL Server Profiler, para
saber qual evento corresponde à ele no Extended Events, basta olharmos o nome que
está na coluna “XEvent Name”, neste caso da imagem, temos que
o “SP:Completed”do SQL Server Profiler corresponde ao evento do Extended Events
chamado module_end. A coluna “SQL Trace Column” diz respeito as colunas que
podemos colocar algum tipo de filtro no evento do SQL Server Profiler, olhando a
coluna “Extended Events action”, teremos a correspondência para esta coluna no evento
coletado pelo Extended Events, no caso da imagem, temos que a coluna
“ApplicationName” do SQL Server Profiler, corresponde a coluna
“client_app_name” no Extended Events.

Alguns exemplos práticos...

No Profiler, se eu quisesse coletar o término da execução de uma stored procedure, eu


coletaria o evento “SP:Completed”, pois bem, vamos configurar uma coleta simples do
profiler que colete este evento selecionando apenas as
colunas“database_id”, “spid”, “database_name” e “text data”, conforme imagem
abaixo:

Coloque o profiler para executar, volte no SQL Server e execute a procedure


sp_readerrorlog, veja que o evento será coletado pelo Profiler:

Como seria esta coleta usando Extended Events?

Bom, primeiramente pare e encerre o SQL Server Profiler. Com a ajuda daquela query
no início do post, já descobrimos qual evento no Extended Events equivale
ao“SP:Completed” do SQL Server Profiler, no Management Studio, expanda
Management>Extended Events, clique com o direto em “Sessions” e depois clique em
“New Session...”.

Na aba General, Em “Session Name” vamos definir o nome para nossa coleta, vou
chamar de “XCompare”, deixe marcadas as opções “Start the event session immediately
after session creation” e “Watch live data on screen as it is captured”.

Na aba “Events”, na lista de eventos selecione o evento module_end e clique em“>”:


Clique no botão “Configure” localizado a direita na parte superior da janela, na lista e
selecione “database_id”, “database_name”, “session_id” e “sql_text”, agora
podemos clicar em “OK”.

Nossa coleta já está pronta, rode a procedure sp_readerrorlog e veja que na aba “Live
Data” o evento foi coletado da mesma forma que ocorreu usando o SQL Server Profiler:

Informação adicional...

Você pode ainda converter scripts mais complexos gerados pelo SQL Server Profiler
em eventos estendidos através do procedimento descrito no link abaixo:

http://msdn.microsoft.com/library/ff878114.aspx

Bom pessoal, é isso. Façam os seus testes com Extended Events, o seu uso ainda não é
muito popular mas eles com certeza são uma escolha melhor que o SQL Server Profiler
no momento de um troubleshooting de um ambiente com problemas de performance.
Gerenciando e Criando Extended Events
no SSMS do SQL Server 2012

O Extended Events foi lançado no SQL Server 2008, esse recurso para quem não o
conheçe é o mecanismo de monitoramento e análise de eventos do SQL Server. Porém o
SQL Server é baseado em eventos então, com esse robusto recurso é possível consumir
diversas informações para que assim a análise das informações seja mais efetiva.

O SQL Profiler é uma ferramenta de monitoramento, porém o custo efetivo da mesma é


pesado e em por exigir bastante do servidor. Isso ocorre porque para que o profiler
execute é realizado um trace dentro do servidor e isso causa na maioria das vezes um
overhead.

No SQL Server 2008 os Extended Events podiam ser criados somente em T-SQL,
porém no SQL Server 2012 uma nova e rica interface foi construída para a facilidade de
criação e gerenciamento.

Para realizarmos a criação de um Extended Event, iremos conectar no banco de dados


SQL Server 2012 –Management – Extended Events – dois cliques e após isso, botão
direito em New session wizard.

(Figura 1 – Criação de um Extended Event.)

Nesse momento será aberto um wizard aonde ajudará você a realizar a construção de um
novo Extended Event.
(Figura 2 – Nome da sessão (Conexões SQL Server) assim como opção de iniciar o evento ao
iniciar o servidor.)

(Figura 3 – Configuração de um tracking para conexão.)


Nesse momento possuímos dois tipos de configuração.

Use this event session template


Para nos ajudar, há alguns modelos já prontos, eventos nos quais são mais comuns,
portanto somente a título de exemplo iremos utilizar o template de Connection
Tracking, aonde ele realizará a captura de diversas informações sempre que houver uma
nova conxão com o servidor.
Dot not use a template
Aqui você pode especificar o que você deseja capturar, o controle passa a ser totalmente
seu ou seja o poder está sem suas mãos.

(Figura 4 – É possível ver a descrição de todos os eventos associados, como há muito eventos
há uma pesquisa dentro da biblioteca, o que facilita bastante na hora de acrescentar um novo
evento.)
(Figura 5 – É possível capturar os eventos globais, assim como host_name, sql_text,
database name dentre outras informações, é possível acrescentar mais informações para
o seu Extended Event.)

(Figura 6 - Se desejar, você pode realizar a criação de filtros, assim você pode combinar diversas
condições utilizando OR e AND.)
(Figura 7 – Configurando e salvando o arquivo .XEL)

(Figura 8 – Sumário.)
Se desejar utilizar novamente, clique em Script….

CREATE EVENT SESSION [Conexões SQL Server] ON SERVER

ADD EVENT sqlserver.connectivity_ring_buffer_recorded(

ACTION(sqlserver.client_app_name,sqlserver.client_connection_id,sqlserver.client_h
ostname,sqlserver.context_info,sqlserver.database_name,sqlserver.server_principal_na
me,sqlserver.session_id,sqlserver.sql_text)),

ADD EVENT sqlserver.login(SET collect_options_text=(1)

ACTION(sqlserver.client_app_name,sqlserver.client_connection_id,sqlserver.client_h
ostname,sqlserver.context_info,sqlserver.database_name,sqlserver.server_instance_na
me,sqlserver.server_principal_name,sqlserver.sql_text)),

ADD EVENT sqlserver.logout(

ACTION(sqlserver.client_app_name,sqlserver.client_connection_id,sqlserver.client_h
ostname,sqlserver.context_info,sqlserver.database_name,sqlserver.server_instance_na
me,sqlserver.server_principal_name,sqlserver.session_id,sqlserver.sql_text))

ADD TARGET package0.event_file(SETfilename=N’C:\Temp\DadosAcessoBasedeDad


os.xel’,max_rollover_files=(2)),

ADD TARGET package0.ring_buffer

WITH (MAX_MEMORY=4096KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_E
VENT_LOSS,MAX_DISPATCH_LATENCY=30SECONDS,MAX_EVENT_SIZE=0KB,
MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=ON,STARTUP_STATE
=ON)

GO
(Figura 9 – Após criação, você poderá verificar todos os eventos que estão sendo
capturados, para isso marque as opções. Ele iniciará a sessão e te levará a uma tela
aonde você terá acesso as informações.)
(Figura 10 – Informaões de login e logout sendo coletadas com sucesso.)

Deseja mais informações sobre Extended Events, sugiro leitura no MSDN, segue links –
http://msdn.microsoft.com/en-
us/library/bb630354(v=sql.105).aspx e http://msdn.microsoft.com/en-
us/library/bb630282.aspx
EXTENDED EVENTS –
CAPTURANDO DEADLOCK
Neste post demonstrarei como capturar deadlock utilizando Extend Events.
Este é um recurso novo contido no SQL Server 2012.
Vamos aos passos:

1. Abra o SQL Server Management Studio;


2. Conecte em uma instância SQL Server 2012;
3. Vá até Management >> Extended Events;

4. Expanda Extended Events, clique com botão direito sobre Sessions e


selecione New Session Wizard;
5. Clicar em Next;

6. Informe Session Name e clique em Next;


7. Existe a opção de utilizar os modelos já pontos conforme mostrado abaixo,
mas nós não utilizaremos estes modelos.É só a título de informação.

8. Selecione Do not use a template e clique em Next;


9. Digite “Deadlock” em Event library;

10. Selecione os itens retornados;

11.
12. Mova os itens para Selected Events e clique em Next;

13. Selecione os campos que deseja retornar e clicar em Next;


Neste caso estou selecionado:
– database_id
– database_name
– session_id
– sql_text
– user_nameMas fique a vontade para sua seleção de colunas.
14. Neste caso não selecionaremos filtro. Clicar em Next;

15.Não armazenaremos a coleta das informações. Clicar em Next;


16. Clicar em Finish;

17. Clique em Close;


18. Verificando a sessão criada;
Podemos observar que a sessão esta criada, porem não iniciada.

19. Selecione a sessão criada, clique com botão direito sobre a sessão e
seleciona Start Session;

20. Podemos observar que após o Start da sessão a mesma passou para cor
verde;
21. Próxima etapa vai ser criar duas tabelas e inserir dois registros para
testarmos a captura das informações;
22.

23. Clique com botão direito sobre a sessão criada anteriormente e


selecione Watch Live Data;
24. Abrirá uma sessão vazia conforme abaixo;

25. Execute simultaneamente os scripts abaixo;

26. Após a execução podemos observar que ocorreu deadlock na sessão 2;


27. Abaixo podemos ver as informações capturadas referente
ao deadlockocorrido;

28. Clique sobre xml_deadlock_report;


29. E de um duplo clique sobre xml_report para analisar as informações.

Você também pode gostar