Você sabe o que são (statements, batchs, query_hash e query_plan_hash) no SQL SERVER?


    Hello people! Espero que estejam todos ótimo :)


    Hoje eu gostaria de falar sobre uma sopa de palavras, mas que são muito importantes para o entendimento do sql server. resolvi escrever sobre esses termos, pois vejo que alguns DBAs possuem dúvidas sobre, ou até mesmo desconhecem.


Irei começar explicando sobre o BATCH e o STATEMENT, abaixo um resumo de cada palavra

BATCH: No Transact-SQL, um lote é um conjunto de instruções SQL enviadas juntas e executadas como um grupo, uma após a outra. 

STATEMENT: É uma unidade atômica de trabalho e é completamente bem-sucedida ou falha completamente.


Agora que sabemos o que cada uma dessa palavra significa, segundo a própria Microsoft, vou mostrar um exemplo, onde podemos ver um BATCH que possui 3 statements:


Agora que você sabe o que é um BATCH e um STATEMENT, vamos reutilizar o exemplo acima para explicar o que é QUERY_HASH E UM QUERY_PLAN_HASH, mas antes vamos  as definições:

QUERY_HASH : Valor de hash binário calculado na consulta e usado para identificar consultas com lógica semelhante.

QUERY_PLAN_HASH: Valor de hash binário calculado no plano de execução de consulta e usado para identificar planos de execução de consulta semelhantes


O que eu gostaria de destacar nesse ponto, é sobre o query_hash. Ele é um identificador único para cada query que possuem a mesma lógica, vamos a um exemplo:


Será que essas duas consultas possuem o mesmo query_hash? Vamos verificar..

Para a consulta 1, temos o query_hash = 0x9924D813C14E8EF9


Para a consulta 2, temos o query_hash = 0x9924D813C14E8EF9


Podemos reparar que é o mesmo query_hash, pois as consultas possuem a mesma lógica mudando apenas o predicado de busca.


 Nesse exemplo eu busquei o query_hash pelo plano de execução, mas poderia pegar pelas DMvs também, como por exemplo:


Podemos ver que é o mesmo query_hash :)

Agora com auxilio do Query Store, irei demonstrar como um query_hash pode ter mais  deu um query_plan_hash:
Isso é perfeitamente normal e esperado, uma vez que a query pode ter N planos de execução ao longo da sua vida. Vamos pegar esse "query_id" e vamos ver isso graficamente no query store:




Podemos observar na imagem acima que a o query_id  = 61, que por sua vez é o query_hash = 0xD7E260BE9064806E, possui dois planos de execução.



Nessa imagem abaixo, estou mostrando o query_plan_hash do planId = 2:



Nessa imagem abaixo, estou mostrando o query_plan_hash do planId = 7:


Dessa eu consigo, por exemplo provar para o cliente que uma troca de plano degradou a performance. Mas existe diversas outras aplicações.

Bem pessoal, é isso. espero que tenham gostado, qualquer dúvida, podem me procurar :)




Links de referências:

https://docs.microsoft.com/en-us/sql/t-sql/statements/statements?view=sql-server-ver16

https://stackoverflow.com/questions/1703847/what-is-a-batch

https://docs.microsoft.com/pt-br/sql/relational-databases/system-dynamic-management-views/sys-dm-exec-query-stats-transact-sql?view=sql-server-ver16

Comentários

Postagens mais visitadas deste blog

Como realizei um tuning que caiu o tempo de execução de 8h para 7minutos!

Tuning no Postgres utlizando View Materializada

Amazon RDS parte 1