Explorer les temps d’exécution

Cette rubrique explique comment examiner les performances passées des requêtes et des tâches. Ces informations permettent d’identifier les candidats à l’optimisation des performances et de voir si vos stratégies d’optimisation ont l’effet escompté.

Vous pouvez découvrir l’historique des performances en utilisant Snowsight ou en écrivant des requêtes sur les vues du schéma ACCOUNT_USAGE. Un utilisateur n’ayant pas accès au schéma ACCOUNT_USAGE peut interroger des données similaires à l’aide de l’Information Schema.

Visualiser les temps d’exécution et de chargement

Vous pouvez utiliser Snowsight pour obtenir des informations visuelles sur la performance des requêtes et des tâches ainsi que sur la charge d’un entrepôt.

Requêtes
  1. Connectez-vous à Snowsight.

  2. Sélectionnez Activity » Query History.

  3. Utilisez la colonne Duration pour comprendre le temps d’exécution d’une requête. Vous pouvez trier la colonne pour trouver les requêtes les plus longues.

  4. Si vous souhaitez vous concentrer sur les requêtes d’un utilisateur particulier, utilisez le menu déroulant User pour sélectionner l’utilisateur.

  5. Si vous souhaitez vous concentrer sur les requêtes qui ont été exécutées sur un entrepôt particulier, sélectionnez Filters » Warehouse, puis l’entrepôt.

Entrepôts
  1. Connectez-vous à Snowsight.

  2. Passez à un rôle qui a des privilèges sur l’entrepôt.

  3. Sélectionnez Admin » Warehouses.

  4. Sélectionnez un entrepôt.

  5. Utilisez le graphique Warehouse Activity pour visualiser la charge de l’entrepôt, y compris les requêtes en attente.

Tâches
  1. Connectez-vous à Snowsight.

  2. Sélectionnez Activity » Task History pour afficher le temps nécessaire à l’exécution du code SQL d’une tâche.

Analyser de manière approfondie les temps d’exécution

Le profil de requête vous permet d’examiner les parties d’une requête dont l’exécution est la plus longue. Il comprend un volet Most Expensive Nodes qui identifie les nœuds de l’opérateur dont l’exécution est la plus longue. Vous pouvez aller encore plus loin en visualisant le pourcentage du temps d’exécution d’un nœud consacré à une catégorie particulière de traitement des requêtes.

Pour accéder au profil de requête d’une requête :

  1. Connectez-vous à Snowsight.

  2. Sélectionnez Activity » Query History.

  3. Sélectionnez l’ID d’une requête.

  4. Sélectionnez l’onglet Query Profile.

Astuce

Vous pouvez accéder par programme aux statistiques de performance du profil de requête en exécutant la fonction GET_QUERY_OPERATOR_STATS.

Écrire des requêtes pour explorer les temps d’exécution

Le schéma Account Usage contient des vues relatives aux temps d’exécution des requêtes et des tâches. Il contient également une vue relative à la charge d’un entrepôt lorsqu’il exécute des requêtes. Vous pouvez écrire des requêtes à partir de ces vues pour analyser de façon approfondie les données de performance et créer des rapports et des tableaux de bord personnalisés.

Par défaut, seul l’administrateur du compte (c’est-à-dire l’utilisateur ayant le rôle ACCOUNTADMIN) peut accéder aux vues du schéma ACCOUNT_USAGE. Pour permettre à d’autres utilisateurs d’accéder à ces vues, reportez-vous à Activation de l’utilisation de la base de données SNOWFLAKE pour d’autres rôles.

Les utilisateurs qui n’ont pas accès au schéma ACCOUNT_USAGE (par exemple, un utilisateur qui a exécuté une requête ou un administrateur d’entrepôt) peuvent toujours obtenir les temps d’exécution récents et d’autres métadonnées de requête en utilisant les fonctions de table QUERY_HISTORY de l’Information Schema.

Il faut savoir que les vues ACCOUNT_USAGE ne sont pas mises à jour immédiatement après l’exécution d’une requête ou d’une tâche. Si vous souhaitez vérifier le temps d’exécution d’une requête juste après l’avoir exécutée, utilisez Snowsight pour visualiser ses performances. L’Information Schema est également mis à jour plus rapidement que les vues ACCOUNT_USAGE.

Vue ACCOUNT_USAGE

Description

Latence

QUERY_HISTORY

Permet d’analyser l’historique des requêtes Snowflake selon différentes dimensions (plage de temps, temps d’exécution, session, utilisateur, entrepôt, etc.) au cours des 365 derniers jours (1 an).

Jusqu’à 45 minutes

WAREHOUSE_LOAD_HISTORY

Permet d’analyser la charge de travail d’un entrepôt dans une plage de dates spécifiée.

Jusqu’à 3 heures

TASK_HISTORY

Permet de récupérer l’historique de l’utilisation des tâches au cours des 365 derniers jours (1 an).

Jusqu’à 45 minutes

Exemples de requêtes

Les requêtes suivantes sur le schéma ACCOUNT_USAGE donnent un aperçu des performances passées des requêtes, des entrepôts et des tâches. Cliquez sur le nom d’une requête pour voir l’exemple SQL complet.

Performances de la requête.
Charge d’entrepôt
Performance des tâches

Performances de la requête.

Requête : les n requêtes les plus longues

Cette requête fournit une liste des n (50 dans l’exemple ci-dessous) requêtes les plus longues au cours de la dernière journée. Vous pouvez ajuster la fonction DATEADD pour vous focaliser sur une période plus courte ou plus longue. Remplacez my_warehouse par le nom d’un entrepôt.

SELECT query_id,
  ROW_NUMBER() OVER(ORDER BY partitions_scanned DESC) AS query_id_int,
  query_text,
  total_elapsed_time/1000 AS query_execution_time_seconds,
  partitions_scanned,
  partitions_total,
FROM snowflake.account_usage.query_history Q
WHERE warehouse_name = 'my_warehouse' AND TO_DATE(Q.start_time) > DATEADD(day,-1,TO_DATE(CURRENT_TIMESTAMP()))
  AND total_elapsed_time > 0 --only get queries that actually used compute
  AND error_code IS NULL
  AND partitions_scanned IS NOT NULL
ORDER BY total_elapsed_time desc
LIMIT 50;
Copy
Requête : requêtes organisées par temps d’exécution au cours du dernier mois

Cette requête regroupe les requêtes pour un entrepôt donné par compartiments pour le temps d’exécution ou cours du dernier mois. Ces tendances dans le temps d’exécution des requêtes peuvent aider à prendre des décisions pour redimensionner les entrepôts ou séparer certaines requêtes vers un autre entrepôt. Remplacez MY_WAREHOUSE par le nom d’un entrepôt.

SELECT
  CASE
    WHEN Q.total_elapsed_time <= 60000 THEN 'Less than 60 seconds'
    WHEN Q.total_elapsed_time <= 300000 THEN '60 seconds to 5 minutes'
    WHEN Q.total_elapsed_time <= 1800000 THEN '5 minutes to 30 minutes'
    ELSE 'more than 30 minutes'
  END AS BUCKETS,
  COUNT(query_id) AS number_of_queries
FROM snowflake.account_usage.query_history Q
WHERE  TO_DATE(Q.START_TIME) >  DATEADD(month,-1,TO_DATE(CURRENT_TIMESTAMP()))
  AND total_elapsed_time > 0
  AND warehouse_name = 'my_warehouse'
GROUP BY 1;
Copy
Requête : recherchez les requêtes répétées les plus longues

Vous pouvez utiliser le hachage de la requête (la valeur de la colonne query_hash dans la vue ACCOUNT_USAGE QUERY_HISTORY) pour trouver des modèles de performance des requêtes qui pourraient ne pas être évidents. 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 du nombre d’exécutions de la requête.

Vous pouvez utiliser le hachage de requête pour identifier les requêtes que vous devriez optimiser en priorité. Par exemple, la requête suivante utilise la valeur de la colonne query_hash pour identifier les IDs de requête parmi 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;
Copy
Requête : suivez la performance moyenne d’une requête dans le temps

L’instruction suivante calcule la moyenne quotidienne du temps total écoulé pour toutes les requêtes ayant un hachage de requête paramétré spécifique (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);
Copy

Charge d’entrepôt

Requête : charge totale de l’entrepôt

Cette requête permet de connaître la charge totale d’un entrepôt pour les requêtes exécutées et en attente. Ces valeurs de charge représentent le rapport entre le temps d’exécution total (en secondes) de toutes les requêtes dans un état spécifique dans un intervalle et le temps total (en secondes) pour cet intervalle.

Par exemple, si « 276 secondes » était le temps total pour 4 requêtes dans un intervalle de 5 minutes (300 secondes), alors la valeur de la charge de requête est 276 / 300 = 0,92.

 SELECT TO_DATE(start_time) AS date,
  warehouse_name,
  SUM(avg_running) AS sum_running,
  SUM(avg_queued_load) AS sum_queued
FROM snowflake.account_usage.warehouse_load_history
WHERE TO_DATE(start_time) >= DATEADD(month,-1,CURRENT_TIMESTAMP())
GROUP BY 1,2
HAVING SUM(avg_queued_load) >0;
Copy

Performance des tâches

Requête : tâches les plus longues

Cette requête répertorie les tâches les plus longues exécutées au cours de la dernière journée, ce qui peut indiquer une possibilité d’optimiser le code SQL exécuté par la tâche.

SELECT DATEDIFF(seconds, query_start_time,completed_time) AS duration_seconds,*
FROM snowflake.account_usage.task_history
WHERE state = 'SUCCEEDED'
  AND query_start_time >= DATEADD (day, -1, CURRENT_TIMESTAMP())
ORDER BY duration_seconds DESC;
Copy