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

Arguments

query_id

ID 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()));
    
    Copy
  • 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, TableScan or Filter.

OPERATOR_STATISTICS

VARIANT contenant un OBJECT

Statistics about the operator (for example, the number of output rows from the operator).

EXECUTION_TIME_BREAKDOWN

VARIANT contenant un OBJECT

Informations sur le temps d’exécution de l’opérateur.

OPERATOR_ATTRIBUTES

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

dml

Statistics for Data Manipulation Language (DML) queries.

number_of_rows_inserted

DOUBLE

Number of rows inserted into a table or tables.

number_of_rows_updated

DOUBLE

Number of rows updated in a table.

number_of_rows_deleted

DOUBLE

Number of rows deleted from a table.

number_of_rows_unloaded

DOUBLE

Number of rows unloaded during data export.

extension_functions

Information about calls to extension functions. If the value of a field is zero, then the field is not displayed.

Java UDF handler load time

DOUBLE

Amount of time for the Java UDF handler to load.

Total Java UDF handler invocations

DOUBLE

Number of times the Java UDF handler is invoked.

Max Java UDF handler execution time

DOUBLE

Maximum amount of time for the Java UDF handler to execute.

Avg Java UDF handler execution time

DOUBLE

Average amount of time to execute the Java UDF handler.

Java UDTF process() invocations

DOUBLE

Number of times the Java UDTF process method was invoked.

Java UDTF process() execution time

DOUBLE

Amount of time to execute the Java UDTF process.

Avg Java UDTF process() execution time

DOUBLE

Average amount of time to execute the Java UDTF process.

Java UDTF's constructor invocations

DOUBLE

Number of times the Java UDTF constructor was invoked.

Java UDTF's constructor execution time

DOUBLE

Amount of time to execute the Java UDTF constructor.

Avg Java UDTF's constructor execution time

DOUBLE

Average amount of time to execute the Java UDTF constructor.

Java UDTF endPartition() invocations

DOUBLE

Number of times the Java UDTF endPartition method was invoked.

Java UDTF endPartition() execution time

DOUBLE

Amount of time to execute the Java UDTF endPartition method.

Avg Java UDTF endPartition() execution time

DOUBLE

Average amount of time to execute the Java UDTF endPartition method.

Max Java UDF dependency download time

DOUBLE

Maximum amount of time to download the Java UDF dependencies.

Max JVM memory usage

DOUBLE

Peak memory usage as reported by the JVM.

Java UDF inline code compile time in ms

DOUBLE

Compile time for the Java UDF inline code.

Total Python UDF handler invocations

DOUBLE

Number of times the Python UDF handler was invoked.

Total Python UDF handler execution time

DOUBLE

Total execution time for the Python UDF handler.

Avg Python UDF handler execution time

DOUBLE

Average amount of time to execute the Python UDF handler.

Python sandbox max memory usage

DOUBLE

Peak memory usage by the Python sandbox environment.

Avg Python env creation time: Download and install packages

DOUBLE

Average amount of time to create the Python environment, including downloading and installing packages.

Conda solver time

DOUBLE

Amount of time to run the Conda solver to solve Python packages.

Conda env creation time

DOUBLE

Amount of time to create the Python environment.

Python UDF initialization time

DOUBLE

Amount of time to initialize the Python UDF.

Number of external file bytes read for UDFs

DOUBLE

Number of external file bytes read for UDFs.

Number of external files accessed for UDFs

DOUBLE

Number of external files accessed for UDFs.

external_functions

Information about calls to external functions. If the value of a field — for example retries_due_to_transient_errors — is zero, then the field is not displayed.

total_invocations

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.

rows_sent

DOUBLE

Number of rows sent to external functions.

rows_received

DOUBLE

Number of rows received back from external functions.

bytes_sent (x-region)

DOUBLE

Number of bytes sent to external functions. If the key includes (x-region), the data was sent across regions, which can impact billing.

bytes_received (x-region)

DOUBLE

Number of bytes received from external functions. If the key includes (x-region), the data was sent across regions, which can impact billing.

retries_due_to_transient_errors

DOUBLE

Number of retries because of transient errors.

average_latency_per_call

DOUBLE

Average amount of time per invocation (call) in milliseconds between the time Snowflake sent the data and received the returned data.

http_4xx_errors

INTEGER

Nombre total de requêtes HTTP ayant renvoyé un code de statut 4xx.

http_5xx_errors

INTEGER

Nombre total de requêtes HTTP ayant renvoyé un code de statut 5xx.

average_latency

DOUBLE

Temps de latence moyen pour les requêtes HTTP réussies.

avg_throttle_latency_overhead

DOUBLE

Average overhead per successful request because of a slowdown caused by throttling (HTTP 429).

batches_retried_due_to_throttling

DOUBLE

Number of batches that were retried because of HTTP 429 errors.

latency_per_successful_call_(p50)

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.

latency_per_successful_call_(p90)

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.

latency_per_successful_call_(p95)

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.

latency_per_successful_call_(p99)

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.

input_rows

INTEGER

Number of input rows. This can be missing for an operator with no input edges from other operators.

io

Informations sur les opérations d’entrée/sortie effectuées pendant la requête.

scan_progress

DOUBLE

Percentage of data scanned for a given table so far.

bytes_scanned

DOUBLE

Number of bytes scanned so far.

percentage_scanned_from_cache

DOUBLE

Percentage of data scanned from the local disk cache.

bytes_written

DOUBLE

Bytes written; for example, when loading into a table.

bytes_written_to_result

DOUBLE

Octets écrits dans un objet de résultat.

For example, SELECT * FROM ... would produce a set of results in tabular format representing each field in the selection.

En général, l’objet de résultats représente tout ce qui est produit comme résultat de la requête, et bytes_written_to_result représente la taille du résultat retourné.

bytes_read_from_result

DOUBLE

Octets lus à partir d’un objet de résultat.

external_bytes_scanned

DOUBLE

Bytes read from an external object; for example, a stage.

network

network_bytes

DOUBLE

Amount of data sent over the network.

output_rows

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.

pruning

Informations sur le nettoyage de la table.

partitions_pruned_by_snowflake_optima

DOUBLE

Number of partitions pruned by Snowflake Optima.

partitions_scanned

DOUBLE

Number of partitions scanned so far.

partitions_total

DOUBLE

Total number of partitions in a given table.

spilling

Informations sur l’utilisation du disque pour les opérations où les résultats intermédiaires ne rentrent pas dans la mémoire.

bytes_spilled_remote_storage

DOUBLE

Volume of data spilled to remote disk.

bytes_spilled_local_storage

DOUBLE

Volume of data spilled to local disk.

search_optimization

Informations sur les requêtes qui utilisent le service d’optimisation de la recherche.

partitions_pruned_by_search_optimization

DOUBLE

Number of partitions pruned by search optimization.

partitions_pruned_by_search_optimization_and_snowflake_optima

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

overall_percentage

DOUBLE

Percentage of the total query time spent by this operator.

initialization

DOUBLE

Temps passé à configurer le traitement de la requête.

processing

DOUBLE

Temps passé à traiter les données par le CPU.

synchronization

DOUBLE

Temps passé à synchroniser les activités entre les processus participants.

local_disk_io

DOUBLE

Temps pendant lequel le traitement a été bloqué en attendant l’accès au disque local.

remote_disk_io

DOUBLE

Temps pendant lequel le traitement a été bloqué en attendant l’accès au disque distant.

network_communication

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

Aggregate

functions

ARRAY de VARCHAR

Liste des fonctions calculées.

grouping_keys

ARRAY de VARCHAR

Group-by expression.

CartesianJoin

additional_join_condition

VARCHAR

Expression de jointure de non-égalité.

equality_join_condition

VARCHAR

Expression de jointure d’égalité.

join_type

VARCHAR

Type de jointure (INNER).

Delete

table_name

VARCHAR

Nom de la table mise à jour.

ExternalScan

stage_name

VARCHAR

Le nom de la zone de préparation à partir de laquelle les données sont lues.

stage_type

VARCHAR

Type de zone de préparation.

Filter

filter_condition

VARCHAR

Expression utilisée pour filtrer les données.

Flatten

input

VARCHAR

Input expression used to flatten data.

Generator

row_count

NUMBER

Valeur du paramètre d’entrée ROWCOUNT.

time_limit

NUMBER

Valeur du paramètre d’entrée TIMELIMIT.

GroupingSets

functions

ARRAY de VARCHAR

Liste des fonctions calculées.

key_sets

ARRAY de VARCHAR

Liste des ensembles de groupement.

Insert

input_expression

VARCHAR

Expressions insérées.

table_names

ARRAY de VARCHAR

Liste des noms de tables dans lesquelles les enregistrements sont ajoutés.

InternalObject

object_name

VARCHAR

Name of the accessed object.

Join

additional_join_condition

VARCHAR

Expression de jointure de non-égalité.

equality_join_condition

VARCHAR

Expression de jointure d’égalité.

join_type

VARCHAR

Type de jointure (INNER, OUTER, LEFT JOIN, etc.).

JoinFilter

join_id

NUMBER

Operator id of the join used to identify tuples that can be filtered out.

Merge

table_name

VARCHAR

Nom de la table mise à jour.

Pivot

grouping_keys

ARRAY de VARCHAR

Colonnes restantes sur lesquelles les résultats sont agrégés.

pivot_column

ARRAY de VARCHAR

Colonnes résultantes des valeurs pivot.

Result

expressions

ARRAY de VARCHAR

Liste des expressions produites.

Sort

sort_keys

ARRAY de VARCHAR

Expression définissant l’ordre de tri.

SortWithLimit

offset

NUMBER

Position dans la séquence ordonnée à partir de laquelle les tuples produits sont émis.

rows

NUMBER

Nombre de lignes produites.

sort_keys

ARRAY de VARCHAR

Expression définissant l’ordre de tri.

TableScan

columns

ARRAY de VARCHAR

Liste des colonnes analysées.

extracted_variant_paths

ARRAY de VARCHAR

Liste des chemins extraits des colonnes de variantes.

table_alias

VARCHAR

Alias de la table à laquelle on accède.

table_name

VARCHAR

Nom de la table à laquelle on accède.

Unload

location

VARCHAR

Zone de préparation où les données sont sauvegardées.

Unpivot

expressions

ARRAY de VARCHAR

Colonnes de sortie de la requête de dépivotage.

Update

table_name

VARCHAR

Nom de la table mise à jour.

ValuesClause

value_count

NUMBER

Nombre de valeurs produites.

values

VARCHAR

Liste de valeurs.

WindowFunction

functions

ARRAY de VARCHAR

Liste des fonctions calculées.

WithClause

name

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:

    • UnionAll

    • ExternalFunction

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;
Copy

Obtenez l’ID de requête :

SET lqid = (SELECT LAST_QUERY_ID());
Copy

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));
Copy
+--------------------------------------+---------+-------------+--------------------+---------------+-----------------------------------------+-----------------------------------------------+----------------------------------------------------------------------+
| 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;
Copy

Obtenez l’ID de la requête précédente :

SET lid = LAST_QUERY_ID();
Copy

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;
Copy
+---------+-------------+--------------------------------------------------------------------------+---------------+
| 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.