Uso do hash de consulta para identificar padrões e tendências em consultas¶
Para identificar, agrupar e analisar consultas semelhantes no histórico de consultas, você pode usar um hash do texto da consulta. Por exemplo, você pode:
Agrupe consultas pelo hash de consulta para identificar padrões em consultas caras.
Determine os efeitos das melhorias de desempenho (por exemplo, alterações nas chaves de clustering) em consultas repetidas.
Nas exibições e funções de tabela a seguir, você pode usar as colunas query_hash
e query_parameterized_hash
para obter o hash do texto da consulta:
Exibições do ACCOUNT_USAGE (retenção de 1 ano)
Funções de tabela do INFORMATION_SCHEMA (retenção de 7 dias)
Função de tabela QUERY_HISTORY
Função de tabela TASK_HISTORY
Você pode usar esse hash para analisar consultas repetidas.
Uso do hash da consulta (query_hash
)¶
A coluna query_hash
contém um valor de hash que é calculado com base no texto canônico da instrução SQL. Consultas repetidas que têm exatamente o mesmo texto de consulta têm os mesmos valores de query_hash
.
Consultas repetidas também terão o mesmo query_hash
se o texto de consulta for diferente apenas no seguinte:
Identificador, variável de sessão e nome de estágio que não diferenciam maiúsculas de minúsculas
Observe que isso não inclui identificadores especificados usando IDENTIFIER() com variáveis de vinculação. Variáveis de vinculação com valores diferentes produzem hashes de consulta diferentes.
Espaço em branco
Comentários
Se qualquer outra parte do texto de consulta de duas consultas for diferente, essas consultas terão valores de query_hash
diferentes.
Por exemplo, as consultas a seguir têm o mesmo valor de query_hash
porque têm exatamente o mesmo texto de consulta.
SELECT * FROM table1 WHERE table1.name = 'TIM'
SELECT * FROM table1 WHERE table1.name = 'TIM'
Você pode usar o valor de query_hash
para encontrar padrões no desempenho da consulta que, de outra forma, não seriam óbvios. Por exemplo, embora uma consulta possa não ser excessivamente cara durante uma única execução, uma consulta repetida com frequência pode levar a custos elevados, com base no número de vezes que ela é executada. Você pode usar o valor de query_hash
para identificar as consultas nas quais focar primeiro na otimização.
Por exemplo, a consulta a seguir usa o valor de query_hash
para identificar IDs da consulta para as 100 consultas de execução mais longa:
SELECT
query_hash,
COUNT(*),
SUM(total_elapsed_time),
ANY_VALUE(query_id)
FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
WHERE warehouse_name = 'MY_WAREHOUSE'
AND DATE_TRUNC('day', start_time) >= CURRENT_DATE() - 7
GROUP BY query_hash
ORDER BY SUM(total_elapsed_time) DESC
LIMIT 100;
Uso do hash da consulta parametrizada (query_parameterized_hash
)¶
query_parameterized_hash
contém um valor de hash que é calculado com base na consulta parametrizada, o que significa a versão da consulta após a parametrização dos literais. Esses literais devem ser usados no predicado de consulta e com um dos seguintes operadores de comparação:
=
(igual a)!=
(não é igual a)>=
(é maior ou igual a)<=
(é menor ou igual a)
Consultas repetidas (incluindo aquelas com valores de parâmetros diferentes) têm o mesmo valor query_parameterized_hash
.
Consultas repetidas também terão o mesmo query_parameterized_hash
se o texto de consulta for diferente apenas no seguinte:
Identificador, variável de sessão e nome de estágio que não diferenciam maiúsculas de minúsculas
Observe que isso não inclui identificadores especificados usando IDENTIFIER() com variáveis de vinculação. Variáveis de vinculação com valores diferentes produzem hashes de consulta diferentes.
Espaço em branco
Comentários
Consultas que têm o mesmo valor query_hash
também têm o mesmo valor query_parameterized_hash
, mas não vice-versa.
Por exemplo, as consultas a seguir têm o mesmo valor query_parameterized_hash
porque os valores literais são a única diferença entre as consultas:
SELECT * FROM table1 WHERE table1.name = 'TIM'
SELECT * FROM table1 WHERE table1.name = 'AIHUA'
Assim como o valor query_hash
, você pode usar o valor query_parameterized_hash
para encontrar padrões no desempenho da consulta que, de outra forma, poderiam não ser óbvios.
A instrução a seguir calcula a média total_elapsed_time
a cada dia para todas as consultas com um valor query_parameterized_hash
específico (cbd58379a88c37ed6cc0ecfebb053b03
):
SELECT
DATE_TRUNC('day', start_time),
SUM(total_elapsed_time),
ANY_VALUE(query_id)
FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
WHERE query_parameterized_hash = 'cbd58379a88c37ed6cc0ecfebb053b03'
AND DATE_TRUNC('day', start_time) >= CURRENT_DATE() - 30
GROUP BY DATE_TRUNC('day', start_time);
Verificação da versão que foi usada para gerar o hash¶
Com o tempo, a lógica usada pelo Snowflake para gerar o hash de consulta pode mudar. Alterações nesta lógica podem resultar em diferentes hashes produzidos para a mesma consulta. Por exemplo, para uma determinada consulta, o hash gerado pela versão 1 da lógica pode ser diferente do hash gerado pela versão 2 da lógica.
As exibições e a saída da função de tabela que incluem as colunas query_hash
e query_parameterized_hash
também incluem as seguintes colunas que especificam a versão da lógica usada para produzir os hashes:
query_hash_version
query_parameterized_hash_version
O número da versão nessas colunas é NUMBER (por exemplo, 1
para a primeira versão da lógica, 2
para a segunda versão da lógica etc.).
Se essas colunas contiverem números de versão diferentes para períodos de tempo diferentes, você poderá usar essas colunas de versão para identificar os diferentes hashes para a mesma consulta. Por exemplo:
...
WHERE (query_hash = 'hash_from_v1' AND query_hash_version = 1)
OR (query_hash = 'hash_from_v2' AND query_hash_version = 2)