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_versionquery_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)