- Catégories :
Fonctions système (Informations sur la requête) , Fonctions de table
GET_QUERY_OPERATOR_STATS¶
Renvoie des statistiques sur les opérateurs de requête individuels dans une requête qui s’est terminée. Vous pouvez exécuter cette fonction pour toute requête terminée exécutée au cours des 14 derniers jours.
You can use this information to understand the structure of a query and identify query operators — for example, the join operator — that cause performance problems.
For example, you can use this information to determine which operators are consuming the most resources. As another example, you can use this function to identify joins that have more output rows than input rows, which can be a sign of an « exploding » join; for example, an unintended Cartesian product.
Ces statistiques sont également disponibles dans l’onglet Profil de requête dans Snowsight. La fonction GET_QUERY_OPERATOR_STATS() rend les mêmes informations disponibles via une interface programmatique.
Pour plus d’informations sur la recherche d’opérateurs de requête problématiques, voir Problèmes de requête courants identifiés par le profil de requête.
Syntaxe¶
GET_QUERY_OPERATOR_STATS( <query_id> )
Arguments¶
query_idID de la requête. Vous pouvez utiliser :
Un littéral de chaîne (une chaîne entourée de guillemets simples).
Une variable de session contenant un ID de requête.
La valeur de retour d’un appel à la fonction LAST_QUERY_ID.
Renvoie¶
La fonction GET_QUERY_OPERATOR_STATS est une fonction de table. Elle renvoie des lignes contenant des statistiques sur chaque opérateur de requête de la requête. Pour plus d’informations, voir les sections Notes sur l’utilisation et Sortie ci-dessous.
Notes sur l’utilisation¶
This function returns statistics only for queries that have completed.
Vous devez disposer des privilèges OPERATE ou MONITOR sur l’entrepôt où vous avez exécuté la requête.
This function provides detailed statistics about each query operator used in the specified query. The following list shows the possible query operators:
Aggregate : regroupe les entrées et calcule les fonctions d’agrégat.
CartesianJoin : un type spécialisé de jointure.
Delete : supprime un enregistrement d’une table.
ExternalFunction : représente le traitement par une fonction externe.
ExternalScan : représente l’accès aux données stockées dans les objets de zone de préparation.
Filter : représente une opération qui filtre les lignes.
Flatten : traite les enregistrements VARIANT, en les aplatissant éventuellement sur un chemin spécifié.
Generator: Generates records by using the TABLE(GENERATOR(…)) construct.
GroupingSets: Represents constructs, such as GROUPING SETS, ROLLUP, and CUBE.
Insert : ajoute un enregistrement à une table via une opération INSERT ou COPY.
InternalObject: Represents access to an internal data object; for example, in an Information Schema or the result of a previous query.
Join : combine deux entrées sur une condition donnée.
JoinFilter : opération de filtrage spéciale qui enlève les tuples qui peuvent être identifiés comme ne correspondant pas à l’état d’une jointure plus loin dans le plan de requête.
Merge : effectue une opération MERGE sur une table.
Pivot : transforme les valeurs uniques d’une colonne en plusieurs colonnes et effectue toute agrégation nécessaire.
Result : renvoie le résultat de la requête.
Sort : trie l’entrée sur une expression donnée.
SortWithLimit : produit une partie de la séquence d’entrée après le tri, généralement le résultat d’une construction
ORDER BY ... LIMIT ... OFFSET ....TableScan : représente l’accès à une table unique.
UnionAll : procède à la concaténation de deux entrées.
Unload : représente une opération COPY qui exporte les données d’une table vers un fichier dans une zone de préparation.
Unpivot : fait pivoter une table en transformant des colonnes en lignes.
Update : met à jour un enregistrement dans une table.
ValuesClause : liste des valeurs fournies avec la clause VALUES.
WindowFunction : calcule les fonctions de la fenêtre.
WithClause : précède le corps de l’instruction SELECT et définit une ou plusieurs CTEs.
WithReference : instance d’une clause WITH.
Les informations sont renvoyées sous forme de table. Chaque ligne de la table correspond à un opérateur. La ligne contient la répartition de l’exécution et les statistiques des requêtes pour cet opérateur.
La ligne peut également énumérer les attributs de l’opérateur (ceux-ci dépendent du type d’opérateur).
Statistics that break down query execution time are expressed as a percentage of the total query execution time.
Pour plus d’informations sur des statistiques spécifiques, voir Sortie (dans cette rubrique).
Comme cette fonction est une fonction de table, vous devez l’utiliser dans une clause FROM et vous devez la délimiter par
TABLE(). Par exemple :SELECT * FROM TABLE(GET_QUERY_OPERATOR_STATS(last_query_id()));
Pour chaque exécution individuelle d’une requête spécifique (c’est-à-dire un UUID spécifique), cette fonction est déterministe ; elle renvoie les mêmes valeurs à chaque fois.
Toutefois, pour différentes exécutions du même texte de requête, cette fonction peut renvoyer des statistiques d’exécution différentes. Les statistiques dépendent de nombreux facteurs. Les facteurs suivants peuvent avoir un impact important sur l’exécution et donc sur les statistiques retournées par cette fonction :
Le volume des données.
La disponibilité de vues matérialisées, et les modifications (le cas échéant) apportées aux données depuis la dernière actualisation de ces vues matérialisées.
La présence ou l’absence d’un clustering.
La présence ou l’absence de données précédemment mises en cache.
La taille de l’entrepôt virtuel.
Les valeurs peuvent également être affectées par des facteurs extérieurs à la requête et aux données de l’utilisateur. Ces facteurs sont généralement faibles. Les facteurs sont les suivants :
Temps d’initialisation de l’entrepôt virtuel.
Latence avec les fonctions externes.
Sortie¶
La fonction renvoie les colonnes suivantes :
Column name |
Data type |
Description |
|---|---|---|
QUERY_ID |
VARCHAR |
ID de requête, qui est un identificateur interne, généré par le système pour l’instruction SQL. |
STEP_ID |
NUMBER(38, 0) |
Identificateur de l’étape dans le plan de requête. |
OPERATOR_ID |
NUMBER(38, 0) |
L’identificateur de l’opérateur. Il est unique dans la requête. Les valeurs commencent à 0. |
PARENT_OPERATORS |
ARRAY contenant un ou plusieurs NUMBER(38, 0) |
Identificateurs des opérateurs parents de cet opérateur, ou NULL s’il s’agit de l’opérateur final du plan de requête (qui est généralement l’opérateur Résultat). |
OPERATOR_TYPE |
VARCHAR |
The type of query operator; for example, |
VARIANT contenant un OBJECT |
Statistics about the operator (for example, the number of output rows from the operator). |
|
VARIANT contenant un OBJECT |
Informations sur le temps d’exécution de l’opérateur. |
|
VARIANT contenant un OBJECT |
Information about the operator. This information depends on the operator type. |
S’il n’y a pas d’information pour la colonne spécifique de l’opérateur, la valeur est NULL.
Three of these columns contain OBJECTs. Each object contains key/value pairs. The tables below describe the keys in these objects.
OPERATOR_STATISTICS¶
Les champs dans OBJECTs pour la colonne OPERATOR_STATISTICS fournissent des informations supplémentaires sur l’opérateur. Ces informations peuvent inclure les éléments suivants :
Clé |
Nested key (if applicable) |
Data type |
Description |
|---|---|---|---|
|
Statistics for Data Manipulation Language (DML) queries. |
||
|
DOUBLE |
Number of rows inserted into a table or tables. |
|
|
DOUBLE |
Number of rows updated in a table. |
|
|
DOUBLE |
Number of rows deleted from a table. |
|
|
DOUBLE |
Number of rows unloaded during data export. |
|
|
Information about calls to extension functions. If the value of a field is zero, then the field is not displayed. |
||
|
DOUBLE |
Amount of time for the Java UDF handler to load. |
|
|
DOUBLE |
Number of times the Java UDF handler is invoked. |
|
|
DOUBLE |
Maximum amount of time for the Java UDF handler to execute. |
|
|
DOUBLE |
Average amount of time to execute the Java UDF handler. |
|
|
DOUBLE |
Number of times the Java UDTF process method was invoked. |
|
|
DOUBLE |
Amount of time to execute the Java UDTF process. |
|
|
DOUBLE |
Average amount of time to execute the Java UDTF process. |
|
|
DOUBLE |
Number of times the Java UDTF constructor was invoked. |
|
|
DOUBLE |
Amount of time to execute the Java UDTF constructor. |
|
|
DOUBLE |
Average amount of time to execute the Java UDTF constructor. |
|
|
DOUBLE |
Number of times the Java UDTF endPartition method was invoked. |
|
|
DOUBLE |
Amount of time to execute the Java UDTF endPartition method. |
|
|
DOUBLE |
Average amount of time to execute the Java UDTF |
|
|
DOUBLE |
Maximum amount of time to download the Java UDF dependencies. |
|
|
DOUBLE |
Peak memory usage as reported by the JVM. |
|
|
DOUBLE |
Compile time for the Java UDF inline code. |
|
|
DOUBLE |
Number of times the Python UDF handler was invoked. |
|
|
DOUBLE |
Total execution time for the Python UDF handler. |
|
|
DOUBLE |
Average amount of time to execute the Python UDF handler. |
|
|
DOUBLE |
Peak memory usage by the Python sandbox environment. |
|
|
DOUBLE |
Average amount of time to create the Python environment, including downloading and installing packages. |
|
|
DOUBLE |
Amount of time to run the Conda solver to solve Python packages. |
|
|
DOUBLE |
Amount of time to create the Python environment. |
|
|
DOUBLE |
Amount of time to initialize the Python UDF. |
|
|
DOUBLE |
Number of external file bytes read for UDFs. |
|
|
DOUBLE |
Number of external files accessed for UDFs. |
|
|
Information about calls to external functions. If the value of a field — for example
|
||
|
DOUBLE |
Number of times that an external function was called. This number can be different from the number of external function calls in the text of the SQL statement because of the number of batches that rows are divided into, the number of retries if there are transient network problems, and so on. |
|
|
DOUBLE |
Number of rows sent to external functions. |
|
|
DOUBLE |
Number of rows received back from external functions. |
|
|
DOUBLE |
Number of bytes sent to external functions. If the key includes |
|
|
DOUBLE |
Number of bytes received from external functions. If the key includes |
|
|
DOUBLE |
Number of retries because of transient errors. |
|
|
DOUBLE |
Average amount of time per invocation (call) in milliseconds between the time Snowflake sent the data and received the returned data. |
|
|
INTEGER |
Nombre total de requêtes HTTP ayant renvoyé un code de statut 4xx. |
|
|
INTEGER |
Nombre total de requêtes HTTP ayant renvoyé un code de statut 5xx. |
|
|
DOUBLE |
Temps de latence moyen pour les requêtes HTTP réussies. |
|
|
DOUBLE |
Average overhead per successful request because of a slowdown caused by throttling (HTTP 429). |
|
|
DOUBLE |
Number of batches that were retried because of HTTP 429 errors. |
|
|
DOUBLE |
50e percentile de latence pour les requêtes HTTP réussies. 50 pour cent de toutes les requêtes acceptées ont été traitées en moins de temps. |
|
|
DOUBLE |
90e percentile de latence pour les requêtes HTTP réussies. 90 pour cent de toutes les requêtes acceptées ont été traitées en moins de temps. |
|
|
DOUBLE |
95e percentile de latence pour les requêtes HTTP réussies. 95 pour cent de toutes les requêtes réussies ont été traitées en moins de temps. |
|
|
DOUBLE |
99e percentile de latence pour les requêtes HTTP réussies. 99 pour cent de toutes les requêtes réussies ont été traitées en moins de temps. |
|
|
INTEGER |
Number of input rows. This can be missing for an operator with no input edges from other operators. |
|
|
Informations sur les opérations d’entrée/sortie effectuées pendant la requête. |
||
|
DOUBLE |
Percentage of data scanned for a given table so far. |
|
|
DOUBLE |
Number of bytes scanned so far. |
|
|
DOUBLE |
Percentage of data scanned from the local disk cache. |
|
|
DOUBLE |
Bytes written; for example, when loading into a table. |
|
|
DOUBLE |
Octets écrits dans un objet de résultat. For example, En général, l’objet de résultats représente tout ce qui est produit comme résultat de la requête, et |
|
|
DOUBLE |
Octets lus à partir d’un objet de résultat. |
|
|
DOUBLE |
Bytes read from an external object; for example, a stage. |
|
|
|
DOUBLE |
Amount of data sent over the network. |
|
INTEGER |
Number of output rows. This can be missing for the operator that returns the results to the user; which is usually the RESULT operator. |
|
|
Informations sur le nettoyage de la table. |
||
|
DOUBLE |
Number of partitions pruned by Snowflake Optima. |
|
|
DOUBLE |
Number of partitions scanned so far. |
|
|
DOUBLE |
Total number of partitions in a given table. |
|
|
Informations sur l’utilisation du disque pour les opérations où les résultats intermédiaires ne rentrent pas dans la mémoire. |
||
|
DOUBLE |
Volume of data spilled to remote disk. |
|
|
DOUBLE |
Volume of data spilled to local disk. |
|
|
Informations sur les requêtes qui utilisent le service d’optimisation de la recherche. |
||
|
DOUBLE |
Number of partitions pruned by search optimization. |
|
|
DOUBLE |
Nombre de partitions supprimées par l’optimisation de la recherche et Snowflake Optima. |
EXECUTION_TIME_BREAKDOWN¶
Les champs dans OBJECTs pour la colonne EXECUTION_TIME_BREAKDOWN sont présentés ci-dessous.
Clé |
Data type |
Description |
|---|---|---|
|
DOUBLE |
Percentage of the total query time spent by this operator. |
|
DOUBLE |
Temps passé à configurer le traitement de la requête. |
|
DOUBLE |
Temps passé à traiter les données par le CPU. |
|
DOUBLE |
Temps passé à synchroniser les activités entre les processus participants. |
|
DOUBLE |
Temps pendant lequel le traitement a été bloqué en attendant l’accès au disque local. |
|
DOUBLE |
Temps pendant lequel le traitement a été bloqué en attendant l’accès au disque distant. |
|
DOUBLE |
Temps pendant lequel le traitement attendait le transfert de données du réseau. |
OPERATOR_ATTRIBUTES¶
Each output row describes one operator in the query. The following table shows the possible types of operators; for example, the Filter operator. For each type of operator, the table shows the possible attributes; for example, the expression used to filter the rows.
Les attributs de l’opérateur sont stockés dans la colonne OPERATOR_ATTRIBUTES, qui est de type VARIANT et contient un OBJECT. L’OBJECT contient des paires clé/valeur. Chaque clé correspond à un attribut de l’opérateur.
Operator name |
Clé |
Data type |
Description |
|---|---|---|---|
|
|||
|
ARRAY de VARCHAR |
Liste des fonctions calculées. |
|
|
ARRAY de VARCHAR |
Group-by expression. |
|
|
|||
|
VARCHAR |
Expression de jointure de non-égalité. |
|
|
VARCHAR |
Expression de jointure d’égalité. |
|
|
VARCHAR |
Type de jointure (INNER). |
|
|
|
VARCHAR |
Nom de la table mise à jour. |
|
|||
|
VARCHAR |
Le nom de la zone de préparation à partir de laquelle les données sont lues. |
|
|
VARCHAR |
Type de zone de préparation. |
|
|
|
VARCHAR |
Expression utilisée pour filtrer les données. |
|
|
VARCHAR |
Input expression used to flatten data. |
|
|||
|
NUMBER |
Valeur du paramètre d’entrée ROWCOUNT. |
|
|
NUMBER |
Valeur du paramètre d’entrée TIMELIMIT. |
|
|
|||
|
ARRAY de VARCHAR |
Liste des fonctions calculées. |
|
|
ARRAY de VARCHAR |
Liste des ensembles de groupement. |
|
|
|||
|
VARCHAR |
Expressions insérées. |
|
|
ARRAY de VARCHAR |
Liste des noms de tables dans lesquelles les enregistrements sont ajoutés. |
|
|
|
VARCHAR |
Name of the accessed object. |
|
|||
|
VARCHAR |
Expression de jointure de non-égalité. |
|
|
VARCHAR |
Expression de jointure d’égalité. |
|
|
VARCHAR |
Type de jointure (INNER, OUTER, LEFT JOIN, etc.). |
|
|
|
NUMBER |
Operator id of the join used to identify tuples that can be filtered out. |
|
|
VARCHAR |
Nom de la table mise à jour. |
|
|||
|
ARRAY de VARCHAR |
Colonnes restantes sur lesquelles les résultats sont agrégés. |
|
|
ARRAY de VARCHAR |
Colonnes résultantes des valeurs pivot. |
|
|
|
ARRAY de VARCHAR |
Liste des expressions produites. |
|
|
ARRAY de VARCHAR |
Expression définissant l’ordre de tri. |
|
|||
|
NUMBER |
Position dans la séquence ordonnée à partir de laquelle les tuples produits sont émis. |
|
|
NUMBER |
Nombre de lignes produites. |
|
|
ARRAY de VARCHAR |
Expression définissant l’ordre de tri. |
|
|
|||
|
ARRAY de VARCHAR |
Liste des colonnes analysées. |
|
|
ARRAY de VARCHAR |
Liste des chemins extraits des colonnes de variantes. |
|
|
VARCHAR |
Alias de la table à laquelle on accède. |
|
|
VARCHAR |
Nom de la table à laquelle on accède. |
|
|
|
VARCHAR |
Zone de préparation où les données sont sauvegardées. |
|
|
ARRAY de VARCHAR |
Colonnes de sortie de la requête de dépivotage. |
|
|
VARCHAR |
Nom de la table mise à jour. |
|
|||
|
NUMBER |
Nombre de valeurs produites. |
|
|
VARCHAR |
Liste de valeurs. |
|
|
|
ARRAY de VARCHAR |
Liste des fonctions calculées. |
|
|
VARCHAR |
Alias de la clause WITH. |
Si un opérateur n’apparaît pas, aucun attribut n’est produit et la valeur est signalée comme {}.
Note
The following operators do not have any operator attributes and therefore are not included in the table of
OPERATOR_ATTRIBUTES:UnionAllExternalFunction
Exemples¶
Les exemples suivants appellent la fonction GET_QUERY_OPERATOR_STATS.
Récupération de données sur une seule requête¶
Cet exemple montre les statistiques d’une instruction SELECT qui joint deux petites tables.
Exécutez l’instruction SELECT :
SELECT x1.i, x2.i
FROM x1 INNER JOIN x2 ON x2.i = x1.i
ORDER BY x1.i, x2.i;
Obtenez l’ID de requête :
SET lqid = (SELECT LAST_QUERY_ID());
Appelez GET_QUERY_OPERATOR_STATS() pour obtenir des statistiques sur les opérateurs individuels de la requête :
SELECT * FROM TABLE(GET_QUERY_OPERATOR_STATS($lqid));
+--------------------------------------+---------+-------------+--------------------+---------------+-----------------------------------------+-----------------------------------------------+----------------------------------------------------------------------+
| QUERY_ID | STEP_ID | OPERATOR_ID | PARENT_OPERATORS | OPERATOR_TYPE | OPERATOR_STATISTICS | EXECUTION_TIME_BREAKDOWN | OPERATOR_ATTRIBUTES |
|--------------------------------------+---------+-------------+--------------------+---------------+-----------------------------------------+-----------------------------------------------+----------------------------------------------------------------------|
| 01a8f330-0507-3f5b-0000-43830248e09a | 1 | 0 | NULL | Result | { | { | { |
| | | | | | "input_rows": 64 | "overall_percentage": 0.000000000000000e+00 | "expressions": [ |
| | | | | | } | } | "X1.I", |
| | | | | | | | "X2.I" |
| | | | | | | | ] |
| | | | | | | | } |
| 01a8f330-0507-3f5b-0000-43830248e09a | 1 | 1 | [ 0 ] | Sort | { | { | { |
| | | | | | "input_rows": 64, | "overall_percentage": 0.000000000000000e+00 | "sort_keys": [ |
| | | | | | "output_rows": 64 | } | "X1.I ASC NULLS LAST", |
| | | | | | } | | "X2.I ASC NULLS LAST" |
| | | | | | | | ] |
| | | | | | | | } |
| 01a8f330-0507-3f5b-0000-43830248e09a | 1 | 2 | [ 1 ] | Join | { | { | { |
| | | | | | "input_rows": 128, | "overall_percentage": 0.000000000000000e+00 | "equality_join_condition": "(X2.I = X1.I)", |
| | | | | | "output_rows": 64 | } | "join_type": "INNER" |
| | | | | | } | | } |
| 01a8f330-0507-3f5b-0000-43830248e09a | 1 | 3 | [ 2 ] | TableScan | { | { | { |
| | | | | | "io": { | "overall_percentage": 0.000000000000000e+00 | "columns": [ |
| | | | | | "bytes_scanned": 1024, | } | "I" |
| | | | | | "percentage_scanned_from_cache": 1, | | ], |
| | | | | | "scan_progress": 1 | | "table_name": "MY_DB.MY_SCHEMA.X2" |
| | | | | | }, | | } |
| | | | | | "output_rows": 64, | | |
| | | | | | "pruning": { | | |
| | | | | | "partitions_scanned": 1, | | |
| | | | | | "partitions_total": 1 | | |
| | | | | | } | | |
| | | | | | } | | |
| 01a8f330-0507-3f5b-0000-43830248e09a | 1 | 4 | [ 2 ] | JoinFilter | { | { | { |
| | | | | | "input_rows": 64, | "overall_percentage": 0.000000000000000e+00 | "join_id": "2" |
| | | | | | "output_rows": 64 | } | } |
| | | | | | } | | |
| 01a8f330-0507-3f5b-0000-43830248e09a | 1 | 5 | [ 4 ] | TableScan | { | { | { |
| | | | | | "io": { | "overall_percentage": 0.000000000000000e+00 | "columns": [ |
| | | | | | "bytes_scanned": 1024, | } | "I" |
| | | | | | "percentage_scanned_from_cache": 1, | | ], |
| | | | | | "scan_progress": 1 | | "table_name": "MY_DB.MY_SCHEMA.X1" |
| | | | | | }, | | } |
| | | | | | "output_rows": 64, | | |
| | | | | | "pruning": { | | |
| | | | | | "partitions_scanned": 1, | | |
| | | | | | "partitions_total": 1 | | |
| | | | | | } | | |
| | | | | | } | | |
+--------------------------------------+---------+-------------+--------------------+---------------+-----------------------------------------+-----------------------------------------------+----------------------------------------------------------------------+
Identification des opérateurs d”« explosion » de jointure¶
L’exemple suivant montre comment utiliser GET_QUERY_OPERATOR_STATS pour examiner une requête complexe. Cet exemple recherche les opérateurs dans une requête qui produisent beaucoup plus de lignes que celles qui ont été entrées dans cet opérateur.
Il s’agit de la requête à analyser :
SELECT *
FROM t1
JOIN t2 ON t1.a = t2.a
JOIN t3 ON t1.b = t3.b
JOIN t4 ON t1.c = t4.c;
Obtenez l’ID de la requête précédente :
SET lid = LAST_QUERY_ID();
The following query shows the ratio of output rows to input rows for each of the join operators in the query:
SELECT operator_id,
operator_attributes,
operator_statistics:output_rows / operator_statistics:input_rows AS row_multiple
FROM TABLE(GET_QUERY_OPERATOR_STATS($lid))
WHERE operator_type = 'Join'
ORDER BY step_id, operator_id;
+---------+-------------+--------------------------------------------------------------------------+---------------+
| STEP_ID | OPERATOR_ID | OPERATOR_ATTRIBUTES | ROW_MULTIPLE |
+---------+-------------+--------------------------------------------------------------------------+---------------+
| 1 | 1 | { "equality_join_condition": "(T4.C = T1.C)", "join_type": "INNER" } | 49.969249692 |
| 1 | 3 | { "equality_join_condition": "(T3.B = T1.B)", "join_type": "INNER" } | 116.071428571 |
| 1 | 5 | { "equality_join_condition": "(T2.A = T1.A)", "join_type": "INNER" } | 12.20657277 |
+---------+-------------+--------------------------------------------------------------------------+---------------+
Après avoir identifié les explosions de jonctions, vous pouvez examiner chaque condition de jointure pour vérifier que la condition est correcte.