Utilisation du hachage des requêtes pour identifier des modèles et des tendances dans les requêtes¶
Pour identifier, regrouper et analyser des requêtes similaires dans l’historique des requêtes, vous pouvez utiliser un hachage du texte de la requête. Par exemple, vous pouvez :
Regroupez les requêtes en fonction du hachage de requête afin d’identifier les schémas de requêtes coûteuses.
Déterminer les effets des améliorations de performance (par exemple, les modifications des clés de clustering) sur les requêtes répétées.
Dans les vues et les fonctions de table suivantes, vous pouvez utiliser les colonnes query_hash
et query_parameterized_hash
pour obtenir le hachage du texte de la requête :
Vues ACCOUNT_USAGE (rétention de 1 an)
Fonctions de table INFORMATION_SCHEMA (rétention de 7 jours)
Fonction de table TASK_HISTORY
Vous pouvez utiliser ce hachage pour analyser les requêtes répétées.
Utilisation du hachage de requête (query_hash
)¶
La colonne query_hash
contient une valeur de hachage calculée sur la base du texte canonisé de l’instruction SQL. Les requêtes répétées ayant exactement le même texte de requête ont les mêmes valeurs query_hash
.
Les requêtes répétées ont également le même query_hash
si leur texte de requête ne diffère que par :
Identificateur, variable de session et nom de zone de préparation insensibles à la casse
Notez que cela n’inclut pas les identificateurs spécifiés à l’aide de IDENTIFIER() avec des variables de liaison. Les variables de liaison ayant des valeurs différentes produisent des hachages de requête différents.
Espace blanc
Commentaires
Si une autre partie du texte de deux requêtes diffère, ces requêtes ont des valeurs query_hash
différentes.
Par exemple, les requêtes suivantes ont la même valeur query_hash
parce qu’elles ont exactement le même texte de requête.
SELECT * FROM table1 WHERE table1.name = 'TIM'
SELECT * FROM table1 WHERE table1.name = 'TIM'
Vous pouvez utiliser la valeur de query_hash
pour trouver des modèles de performance des requêtes qui ne seraient pas évidents autrement. Par exemple, bien qu’une requête puisse ne pas être excessivement coûteuse lors d’une seule exécution, une requête fréquemment répétée peut entraîner des coûts élevés, en fonction de son nombre d’exécutions. Vous pouvez utiliser la valeur query_hash
pour identifier les requêtes à optimiser en priorité.
Par exemple, la requête suivante utilise la valeur query_hash
pour identifier les IDs de requête dans les 100 requêtes les plus longues :
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;
Utilisation du hachage de la requête paramétrée (query_parameterized_hash
)¶
query_parameterized_hash
contient une valeur de hachage calculée sur la base de la requête paramétrée, c’est-à-dire la version de la requête après paramétrage des littéraux. Ces littéraux doivent être utilisés dans le prédicat de la requête et doivent être utilisés avec l’un des opérateurs de comparaison suivants :
=
(égal à)!=
(n’est pas égal à)>=
(est supérieur ou égal à)<=
(est inférieur ou égal à)
Les requêtes répétées (y compris celles avec des valeurs de paramètres différentes) ont la même valeur query_parameterized_hash
.
Les requêtes répétées ont également le même query_parameterized_hash
si leur texte de requête ne diffère que par :
Identificateur, variable de session et nom de zone de préparation insensibles à la casse
Notez que cela n’inclut pas les identificateurs spécifiés à l’aide de IDENTIFIER() avec des variables de liaison. Les variables de liaison ayant des valeurs différentes produisent des hachages de requête différents.
Espace blanc
Commentaires
Les requêtes qui ont la même valeur query_hash
ont également la même valeur query_parameterized_hash
mais pas l’inverse.
Par exemple, les requêtes suivantes ont la même valeur query_parameterized_hash
parce que les valeurs de littéral sont la seule différence entre les requêtes :
SELECT * FROM table1 WHERE table1.name = 'TIM'
SELECT * FROM table1 WHERE table1.name = 'AIHUA'
Comme dans le cas de la valeur query_hash
, vous pouvez utiliser la valeur query_parameterized_hash
pour trouver des modèles de performance des requêtes qui ne seraient pas évidents autrement.
L’instruction suivante calcule la moyenne de total_elapsed_time
chaque jour pour toutes les requêtes ayant une valeur query_parameterized_hash
(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);
Vérification de la version utilisée pour générer le hachage¶
Au fil du temps, la logique utilisée par Snowflake pour générer le hachage de la requête peut changer. Toute modification de cette logique peut entraîner la production de hachages différents pour la même requête. Par exemple, pour une requête donnée, le hachage généré par la version 1 de la logique peut être différent du hachage généré par la version 2.
Les vues et la sortie de fonctions de table qui incluent les colonnes query_hash
et query_parameterized_hash
incluent également les colonnes suivantes qui spécifient la version de la logique utilisée pour produire les hachages :
query_hash_version
query_parameterized_hash_version
Le numéro de version dans ces colonnes est un NUMBER (par exemple, 1
pour la première version de la logique, 2
pour la deuxième version de la logique, etc.)
Si ces colonnes contiennent différents numéros de version pour différentes périodes, vous pouvez utiliser ces colonnes de version pour identifier les différents hachages pour la même requête. Par exemple :
...
WHERE (query_hash = 'hash_from_v1' AND query_hash_version = 1)
OR (query_hash = 'hash_from_v2' AND query_hash_version = 2)