Skip Navigation Links
Novas Tecnologias
Ferramentas Adicionais
Ferramentas Adicionais


Dica No :
1217
Assunto : SQL Server
Titulo: Identificando Hash Spills com uso do Extended Events

Gostou do texto ? Vote e dê sua opinião! Pontuação atual :

Translate this page now :






Adicione aos Favoritos!
BlogBlogs Rec6 Linkk Ueba Technorati Delicious DiggIt! StumbleUpon




Na dica anterior (http://bufaloinfo.cloudapp.net/ConteudoTecnico/Dica.aspx?cod=1216) mostrei como identificar os sort spills com uso do extended events. Vamos ver então como identificar os hash spills.

Hash spills ocorrem com planos de execução que utilizam hash match como operador para joins, mas com a estatística desatualizada o hash acaba sendo executado no tempdb ao invés de ser executado em memória.

A forma de identifica-los é muito semelhante aos sort spills, basta utilizarmos o evento correto na montagem da sessão do XE. Veja como fica:

CREATE EVENT SESSION [HashWarnings_2016] ON SERVER
ADD EVENT sqlserver.hash_warning(
ACTION(
sqlserver.client_app_name,sqlserver.database_id,sqlserver.sql_text,
sqlserver.tsql_stack)
)
ADD TARGET package0.event_file(
SET filename=N'C:\xel\HashWarnings2016',max_file_size=(512)
)
GO

Precisaremos de uma query para ler o resultado da captura:


select
DATEADD(hh, DATEDIFF(hh, GETUTCDATE(), CURRENT_TIMESTAMP), theNodes.event_data.value('(./@timestamp)[1]', 'datetime')) AS timestamp,
theNodes.event_data.value('(./data[@name="granted_memory_kb"]/value)[1]', 'int') AS granted_memory_kb,
theNodes.event_data.value('(./data[@name="used_memory_kb"]/value)[1]', 'int') AS used_memory_kb,
theNodes.event_data.value('(./data[@name="worktable_physical_writes"]/value)[1]', 'int') AS worktable_physical_writes,
theNodes.event_data.value('(./data[@name="actual_row_count"]/value)[1]', 'int') AS actual_row_count,
theNodes.event_data.value('(./action[@name="sql_text"]/value)[1]', 'varchar(max)') AS sql_text,
theNodes.event_data.value('(./action[@name="database_id"]/value)[1]', 'int') AS database_id,
DB_NAME(theNodes.event_data.value('(./action[@name="database_id"]/value)[1]', 'int')) database_name
from
(select convert(xml,event_data) event_data
from
sys.fn_xe_file_target_read_file('C:\xel\HashSortWarnings2016*.xel', NULL, NULL, NULL)) theData
cross apply theData.event_data.nodes('//event') theNodes(event_data)


Podemos simular um hash spill utilizando o banco de exemplo adventureworks2012, que você pode baixar da internet. As tabelas Person e Customer se interligam e isso é feito com um hash match. Adulterando as estatísticas da tabela Person isso causa um hash spill.

Para adulterar a estatística da tabela person, execute a seguinte instrução (mas nunca experimente isso em produção) :

UPDATE STATISTICS [person].[person]
WITH ROWCOUNT = 100, PAGECOUNT = 697;
GO

A query para causar o hash spill:

select p.FirstName,p.LastName from sales.customer c, person.person p
where c.personid=p.BusinessEntityID

Para desfazer a "falsificação" das estatísticas, basta reindexar:

alter index pk_Person_businessentityId on person.person rebuild


Nome :
E-mail:
Comentarios :
 
 
Os Últimos Comentários
Nenhum comentário foi realizado ainda. Seja o primeiro !
Dicas
Dica do Dia
Receba Dicas Por Email
E-mail :  
 


 (help)
Aceito receber informativos do devASPNet, informações de eventos e treinamentos

Veja Quais Informativos Você Receberá

Pesquisar Dicas
Pesquisar Artigos, Dicas e Noticias

Banco de Dados
Algumas Entrevistas
Links Importantes

Búfalo Informática, Treinamento e Consultoria
R. Alvaro Alvim, 37/920 Centro - Cinelândia - Rio de Janeiro Cep: 20031-010
Tel : (21) 2262-1368 (21) 9240-5134 E-mail : Contato@bufaloinfo.com.br