- 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.
Vous pouvez utiliser ces informations pour comprendre la structure d’une requête et identifier les opérateurs de requête (par exemple, l’opérateur de jointure) qui causent des problèmes de performance.
Par exemple, vous pouvez utiliser ces informations pour déterminer quels opérateurs consomment le plus de ressources. Autre exemple, vous pouvez utiliser cette fonction pour identifier les jointures qui ont plus de lignes de sortie que de lignes d’entrée, ce qui peut être le signe d’une « explosion » de jointures (par exemple, un produit cartésien involontaire).
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_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¶
Cette fonction ne renvoie que des statistiques sur les requêtes qui ont se sont terminées.
Vous devez disposer des privilèges OPERATE ou MONITOR sur l’entrepôt où vous avez exécuté la requête.
Cette fonction fournit des statistiques détaillées sur chaque opérateur de requête utilisé dans la requête spécifiée. Les opérateurs de requête possibles comprennent :
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 : génère des enregistrements à l’aide de la construction TABLE(GENERATOR(…)).
GroupingSets : représente des constructions, telles que GROUPING SETS, ROLLUP et CUBE.
Insert : ajoute un enregistrement à une table via une opération INSERT ou COPY.
InternalObject : représente l’accès à un objet de données interne (par exemple, dans un Information Schema ou le résultat d’une requête précédente).
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).
Les statistiques qui décomposent le temps d’exécution des requêtes sont exprimées en pourcentage du temps consommé par la requête totale.
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 :
Nom de la colonne |
Type de données |
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 |
Le type d’opérateur de requête (par exemple, |
VARIANT contenant un OBJECT |
Statistiques sur l’opérateur (par exemple, le nombre de lignes de sortie de l’opérateur). |
|
VARIANT contenant un OBJECT |
Informations sur le temps d’exécution de l’opérateur. |
|
VARIANT contenant un OBJECT |
Informations sur l’opérateur. Ces informations dépendent du type d’opérateur. |
S’il n’y a pas d’information pour la colonne spécifique de l’opérateur, la valeur est NULL.
Trois de ces colonnes contiennent des OBJECTs. Chaque objet contient des paires clé/valeur. Les tableaux ci-dessous présentent des informations sur les clés de ces tables.
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é |
Clé imbriquée (si applicable) |
Type de données |
Description |
---|---|---|---|
|
Statistiques des requêtes Data Manipulation Language (DML) : |
||
|
DOUBLE |
Nombre de lignes insérées dans une ou plusieurs tables. |
|
|
DOUBLE |
Nombre de lignes mises à jour dans une table. |
|
|
DOUBLE |
Nombre de lignes supprimées d’une table. |
|
|
DOUBLE |
Nombre de lignes déchargées lors de l’exportation des données. |
|
|
Informations sur les appels à des fonctions externes. Si la valeur d’un champ, par exemple |
||
|
DOUBLE |
Le nombre de fois qu’une fonction externe a été appelée. (Cela peut être différent du nombre d’appels de fonctions externes dans le texte de l’instruction SQL en raison du nombre de lots dans lesquels les lignes sont divisées, du nombre de tentatives (en cas de problèmes de réseau transitoires), etc.) |
|
|
DOUBLE |
Nombre de lignes envoyées aux fonctions externes. |
|
|
DOUBLE |
Nombre de lignes reçues en retour de fonctions externes. |
|
|
DOUBLE |
Le nombre d’octets envoyés aux fonctions externes. Si la clé inclut |
|
|
DOUBLE |
Nombre d’octets reçus depuis des fonctions externes. Si la clé inclut |
|
|
DOUBLE |
Le nombre de tentatives en raison d’erreurs transitoires. |
|
|
DOUBLE |
La durée moyenne par appel en millisecondes entre le moment où Snowflake a envoyé les données et reçu les données renvoyées. |
|
|
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 |
Frais généraux moyens par requête réussie en raison d’un ralentissement causé par la limitation (HTTP 429). |
|
|
DOUBLE |
Nombre de lots qui ont fait l’objet de nouvelles tentatives en raison d’erreurs HTTP 429. |
|
|
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 |
Le nombre de lignes d’entrée. Cela peut manquer pour un opérateur qui n’a pas de bords d’entrée provenant d’autres opérateurs. |
|
|
Informations sur les opérations d’entrée/sortie effectuées pendant la requête. |
||
|
DOUBLE |
Pourcentage de données analysées pour une table donnée jusqu’à présent. |
|
|
DOUBLE |
Nombre d’octets analysés jusqu’à présent. |
|
|
DOUBLE |
Pourcentage de données analysées à partir du cache du disque local. |
|
|
DOUBLE |
Octets écrits (par exemple, lors du chargement dans une table). |
|
|
DOUBLE |
Octets écrits dans un objet de résultat. Par exemple, 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 |
Octets lus à partir d’un objet externe (par exemple, une zone de préparation). |
|
|
|
DOUBLE |
Quantité de données envoyées sur le réseau. |
|
INTEGER |
Le nombre de lignes de sortie. Cela peut manquer pour l’opérateur qui renvoie les résultats à l’utilisateur (qui est généralement l’opérateur RESULT). |
|
|
Informations sur le nettoyage de la table. |
||
|
DOUBLE |
Nombre de partitions analysées jusqu’à présent. |
|
|
DOUBLE |
Nombre total de partitions dans une table donnée. |
|
|
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 de données déversées sur le disque distant. |
|
|
DOUBLE |
Volume de données déversées sur le disque local. |
|
|
Informations sur les appels aux fonctions d’extension. Si la valeur d’un champ est nulle, le champ n’est pas affiché. |
||
|
DOUBLE |
le temps de chargement du gestionnaire d’UDF Java. |
|
|
DOUBLE |
le nombre de fois où le gestionnaire d’UDF Java est appelé. |
|
|
DOUBLE |
la durée maximale d’exécution du gestionnaire d’UDF Java. |
|
|
DOUBLE |
le temps moyen d’exécution du gestionnaire d’UDF Java. |
|
|
DOUBLE |
le nombre de fois où la méthode de traitement des UDTF Java a été appelée. |
|
|
DOUBLE |
le temps nécessaire à l’exécution du traitement des UDTF Java. |
|
|
DOUBLE |
le temps moyen d’exécution du traitement des UDTF Java. |
|
|
DOUBLE |
le nombre de fois où le constructeur d’UDTF Java a été appelé. |
|
|
DOUBLE |
le temps d’exécution du constructeur d’UDTF Java. |
|
|
DOUBLE |
le temps moyen d’exécution du constructeur d’UDTF Java. |
|
|
DOUBLE |
le nombre de fois où la méthode endPartition d’UDTF Java a été appelée. |
|
|
DOUBLE |
le temps nécessaire à l’exécution de la méthode endPartition d’UDTF Java. |
|
|
DOUBLE |
le temps moyen d’exécution de la méthode endPartition d’UDTF Java. |
|
|
DOUBLE |
la durée maximale de téléchargement des dépendances d’UDF Java. |
|
|
DOUBLE |
le pic d’utilisation de la mémoire tel que rapporté par le JVM. |
|
|
DOUBLE |
le temps de compilation pour le code en ligne d’UDF Java. |
|
|
DOUBLE |
le nombre de fois où le gestionnaire d’UDF Python a été appelé. |
|
|
DOUBLE |
le temps d’exécution total du gestionnaire d’UDF Python. |
|
|
DOUBLE |
le temps moyen d’exécution du gestionnaire d’UDF Python. |
|
|
DOUBLE |
l’utilisation maximale de la mémoire par l’environnement sandbox de Python. |
|
|
DOUBLE |
le temps moyen nécessaire pour créer l’environnement Python, y compris le téléchargement et l’installation des paquets. |
|
|
DOUBLE |
le temps nécessaire à l’exécution du solveur Conda pour résoudre les paquets Python. |
|
|
DOUBLE |
le temps nécessaire à la création de l’environnement Python. |
|
|
DOUBLE |
le temps nécessaire à l’initialisation de l’UDF Python. |
|
|
DOUBLE |
le nombre d’octets de fichiers externes lus pour des UDFs. |
|
|
DOUBLE |
le nombre de fichiers externes accédés pour des UDFs. |
EXECUTION_TIME_BREAKDOWN¶
Les champs dans OBJECTs pour la colonne EXECUTION_TIME_BREAKDOWN
sont présentés ci-dessous.
Clé |
Type de données |
Description |
---|---|---|
|
DOUBLE |
Pourcentage du temps total de requête passé par cet opérateur. |
|
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¶
Chaque ligne de sortie décrit un opérateur dans la requête. Le tableau ci-dessous présente les types d’opérateurs possibles (par exemple, l’opérateur Filtre). Pour chaque type d’opérateur, le tableau indique les attributs possibles (par exemple, l’expression utilisée pour filtrer les lignes).
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.
Nom de l’opérateur |
Clé |
Type de données |
Description |
---|---|---|---|
|
|||
|
ARRAY de VARCHAR |
Liste des fonctions calculées. |
|
|
ARRAY de VARCHAR |
L’expression group-by. |
|
|
|||
|
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 |
Expression d’entrée utilisée pour aplatir les données. |
|
|||
|
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 |
Nom de l’objet auquel on accède. |
|
|||
|
VARCHAR |
Expression de jointure de non-égalité. |
|
|
VARCHAR |
Expression de jointure d’égalité. |
|
|
VARCHAR |
Type de jointure (INNER, OUTER, LEFT JOIN, etc.). |
|
|
|
NUMBER |
Identifiant d’opération de la jointure utilisée pour identifier les tuples qui peuvent être filtrées. |
|
|
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
Les opérateurs suivants n’ont pas d’attributs d’opérateur et ne sont donc pas inclus dans la table de
OPERATOR_ATTRIBUTES
:UnionAll
ExternalFunction
Exemples¶
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 | | |
| | | | | | } | | |
| | | | | | } | | |
+--------------------------------------+---------+-------------+--------------------+---------------+-----------------------------------------+-----------------------------------------------+----------------------------------------------------------------------+
Identifier les opérateurs d”« explosion » de jonctions¶
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();
La requête suivante montre le rapport entre les lignes de sortie et les lignes d’entrée pour chacun des opérateurs de jointure de la requête.
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.