- Kategorien:
Systemfunktionen (Abfrageinformationen), Tabellenfunktionen
GET_QUERY_OPERATOR_STATS¶
Gibt Statistiken zu einzelnen Abfrageoperatoren innerhalb einer abgeschlossenen Abfrage zurück. Sie können diese Funktion für jede abgeschlossene Abfrage ausführen, die in den letzten 14 Tagen ausgeführt wurde.
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.
Diese Statistiken sind auch auf der Registerkarte Query Profile von Snowsight verfügbar. Die Funktion GET_QUERY_OPERATOR_STATS() stellt dieselben Informationen auch über eine programmgesteuerte Schnittstelle zur Verfügung.
Weitere Informationen zum Auffinden problematischer Abfrageoperatoren finden Sie unter Typische, von Query Profile identifizierte Abfrageprobleme.
Syntax¶
GET_QUERY_OPERATOR_STATS( <query_id> )
Argumente¶
query_idID einer Abfrage. Sie können dafür Folgendes verwenden:
Ein Zeichenfolgenliteral (eine in einfache Anführungszeichen eingeschlossene Zeichenfolge)
Eine Sitzungsvariable, die eine Abfrage-ID enthält
Den Rückgabewert der Funktion LAST_QUERY_ID
Rückgabewerte¶
Die Funktion GET_QUERY_OPERATOR_STATS ist eine Tabellenfunktion. Sie gibt Zeilen mit Statistiken zu jedem Abfrageoperator in der Abfrage zurück. Weitere Informationen dazu finden Sie unten in den Abschnitten Nutzungshinweise und Ausgabe.
Nutzungshinweise¶
This function returns statistics only for queries that have completed.
Sie müssen über die Berechtigungen OPERATE oder MONITOR für das Warehouse verfügen, in dem Sie die Abfrage ausgeführt haben.
This function provides detailed statistics about each query operator used in the specified query. The following list shows the possible query operators:
Aggregate: Gruppiert die Eingabe und berechnet Aggregatfunktionen.
CartesianJoin: Eine spezieller Typ einer Join-Verknüpfung.
Delete: Entfernt einen Datensatz aus einer Tabelle.
ExternalFunction: Repräsentiert die Verarbeitung durch eine externe Funktion.
ExternalScan: Repräsentiert den Zugriff auf Daten, die in Stagingobjekten gespeichert sind.
Filter: Repräsentiert eine Operation, mit der Datensätze gefiltert werden.
Flatten: Verarbeitet VARIANT-Datensätze und speichert eine vereinfachte Version ggf. in einem angegebenen Pfad.
Generator: Generates records by using the TABLE(GENERATOR(…)) construct.
GroupingSets: Represents constructs, such as GROUPING SETS, ROLLUP, and CUBE.
Insert: Fügt einen Datensatz entweder durch eine INSERT- oder eine COPY-Operation zu einer Tabelle hinzu.
InternalObject: Represents access to an internal data object; for example, in an Information Schema or the result of a previous query.
Join: Kombiniert zwei Eingaben unter einer bestimmten Bedingung.
JoinFilter: Spezielle Filteroperation, bei der Tupel entfernt werden, bei denen festgestellt wurde, dass sie weiter im Abfrageplan möglicherweise nicht mit der Bedingung eines Join übereinstimmen werden.
Merge: Führt eine MERGE-Operation für eine Tabelle aus.
Pivot: Transformiert eindeutige Werte aus einer Spalte in mehrere Spalten und führt alle erforderlichen Aggregationen aus.
Result: Gibt das Abfrageergebnis zurück.
Sort: Sortiert die Eingabe anhand eines gegebenen Ausdrucks.
SortWithLimit: Erstellt nach der Sortierung einen Teil der Eingabesequenz, normalerweise das Ergebnis eines
ORDER BY ... LIMIT ... OFFSET ...-Konstrukts.TableScan: Repräsentiert den Zugriff auf eine einzelne Tabelle.
UnionAll: Verkettet zwei Eingaben.
Unload: Repräsentiert eine COPY-Operation, bei der Daten aus einer Tabelle in eine Datei im Stagingbereich exportiert werden.
Unpivot: Rotiert eine Tabelle, indem Spalten in Zeilen verwandelt werden.
Update: Aktualisiert einen Datensatz in einer Tabelle.
ValuesClause: Liste der Werte, die mit der VALUES-Klausel bereitgestellt wurden.
WindowFunction: Berechnet Fensterfunktionen.
WithClause: Steht vor dem Textkörper (Body) der SELECT-Anweisung und definiert eine oder mehrere CTEs.
WithReference: Instanz einer WITH-Klausel.
Die Informationen werden in Form einer Tabelle zurückgegeben. Jede Zeile in der Tabelle entspricht einem Operator. Die Zeile enthält die Ausführungsaufschlüsselung und die Abfragestatistik für diesen Operator.
Die Zeile kann auch Operatorattribute enthalten (diese hängen vom Typ des Operators ab).
Statistics that break down query execution time are expressed as a percentage of the total query execution time.
Weitere Informationen zu bestimmten Statistiken finden Sie unter Ausgabe (unter diesem Thema).
Da diese Funktion eine Tabellenfunktion ist, müssen Sie sie in einer FROM-Klausel verwenden und in
TABLE()einschließen. Beispiel:SELECT * FROM TABLE(GET_QUERY_OPERATOR_STATS(last_query_id()));
Bei jeder einzelne Ausführung einer bestimmten Abfrage (d. h. einer spezifischen UUID) ist diese Funktion deterministisch, d. h. sie gibt jedes Mal dieselben Werte zurück.
Bei verschiedenen Ausführungen desselben Abfragetextes kann diese Funktion jedoch unterschiedliche Laufzeitstatistiken zurückgeben. Die Statistiken hängen von vielen Faktoren ab. Die folgenden Faktoren können einen großen Einfluss auf die Ausführung dieser Funktion und damit auf die von der Funktion zurückgegebenen Statistiken haben:
Datenvolumen
Verfügbarkeit von materialisierten Ansichten und die Änderungen (falls vorhanden) an den Daten seit der letzten Aktualisierung dieser materialisierten Ansichten.
Vorhandensein oder Fehlen von Clustering
Vorhandensein oder Fehlen von zuvor zwischengespeicherten Daten
Größe des virtuellen Warehouses
Die Werte können auch durch Faktoren außerhalb der Abfrage und der Daten des Benutzers beeinflusst werden. Die Auswirkungen dieser Faktoren sind in der Regel gering. Zu diesen Faktoren zählen:
Initialisierungszeit des virtuellen Warehouses
Latenz bei externen Funktionen
Ausgabe¶
Die Funktion gibt die folgenden Spalten zurück:
Column name |
Data type |
Beschreibung |
|---|---|---|
QUERY_ID |
VARCHAR |
Die Abfrage-ID ist ein interner, vom System generierter Bezeichner für die SQL-Anweisung. |
STEP_ID |
NUMBER(38, 0) |
Bezeichner des Schritts im Abfrageplan. |
OPERATOR_ID |
NUMBER(38, 0) |
Bezeichner des Operators. Dieser ist innerhalb der Abfrage eindeutig. Die Werte beginnen bei 0. |
PARENT_OPERATORS |
ARRAY mit einem oder mehreren NUMBER(38, 0)-Werten |
Die Bezeichner der übergeordneten Operatoren dieses Operators oder NULL, wenn es sich um den letzten Operator im Abfrageplan handelt (in der Regel der „Result“-Operator). |
OPERATOR_TYPE |
VARCHAR |
The type of query operator; for example, |
VARIANT, enthält ein OBJECT |
Statistics about the operator (for example, the number of output rows from the operator). |
|
VARIANT, enthält ein OBJECT |
Informationen zur Ausführungszeit des Operators. |
|
VARIANT, enthält ein OBJECT |
Information about the operator. This information depends on the operator type. |
Wenn es keine Informationen zu dieser spezifischen Spalte zu dem Operator gibt, ist der Wert NULL.
Three of these columns contain OBJECTs. Each object contains key/value pairs. The tables below describe the keys in these objects.
OPERATOR_STATISTICS¶
Die Felder in den OBJECTs für die Spalte OPERATOR_STATISTICS enthalten zusätzliche Informationen zu dem Operator. Dazu zählen folgende Informationen:
Schlüssel |
Nested key (if applicable) |
Data type |
Beschreibung |
|---|---|---|---|
|
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 |
Gesamtzahl der HTTP-Anforderungen, die einen 4xx-Statuscode zurückgegeben haben. |
|
|
INTEGER |
Gesamtzahl der HTTP-Anforderungen, die einen 5xx-Statuscode zurückgegeben haben. |
|
|
DOUBLE |
Durchschnittliche Latenz für erfolgreiche HTTP-Anforderungen. |
|
|
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 |
50th percentile latency for successful HTTP requests. 50 percent of all successful requests took less than this time to complete. |
|
|
DOUBLE |
90th percentile latency for successful HTTP requests. 90 percent of all successful requests took less than this time to complete. |
|
|
DOUBLE |
95th percentile latency for successful HTTP requests. 95 percent of all successful requests took less than this time to complete. |
|
|
DOUBLE |
99th percentile latency for successful HTTP requests. 99 percent of all successful requests took less than this time to complete. |
|
|
INTEGER |
Number of input rows. This can be missing for an operator with no input edges from other operators. |
|
|
Informationen zu den während der Abfrage ausgeführten Eingabe/Ausgabe-Operationen. |
||
|
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 |
Anzahl der Bytes, die in ein Ergebnisobjekt geschrieben wurden. For example, Im Allgemeinen repräsentiert das Ergebnisobjekt das, was als Ergebnis der Abfrage erzeugt wird, und |
|
|
DOUBLE |
Anzahl der Bytes, die aus einem Ergebnisobjekt gelesen wurden. |
|
|
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. |
|
|
Informationen zu den Auswirkungen der Tabellenverkürzung: |
||
|
DOUBLE |
Number of partitions pruned by Snowflake Optima. |
|
|
DOUBLE |
Number of partitions scanned so far. |
|
|
DOUBLE |
Total number of partitions in a given table. |
|
|
Informationen zur Festplattennutzung für Operationen, bei denen Zwischenergebnisse nicht in den Arbeitsspeicher passen. |
||
|
DOUBLE |
Volume of data spilled to remote disk. |
|
|
DOUBLE |
Volume of data spilled to local disk. |
|
|
Informationen zu Abfragen, die den Suchoptimierungsservice nutzen. |
||
|
DOUBLE |
Number of partitions pruned by search optimization. |
|
|
DOUBLE |
Anzahl der Partitionen, die durch die Suchoptimierung und Snowflake Optima bereinigt wurden. |
EXECUTION_TIME_BREAKDOWN¶
Die Felder in den OBJECTs für die Spalte EXECUTION_TIME_BREAKDOWN sind unten aufgeführt.
Schlüssel |
Data type |
Beschreibung |
|---|---|---|
|
DOUBLE |
Percentage of the total query time spent by this operator. |
|
DOUBLE |
Zeit, die für das Einrichten der Abfrageverarbeitung verbraucht wurde. |
|
DOUBLE |
Zeit, die für die Verarbeitung der Daten durch die CPU verbraucht wurde. |
|
DOUBLE |
Zeit, die für das Synchronisieren der Aktivitäten zwischen den beteiligten Prozessen verbraucht wurde. |
|
DOUBLE |
Zeit, in der die Verarbeitung blockiert war, weil auf den Zugriff auf die lokale Festplatte gewartet wurde. |
|
DOUBLE |
Zeit, in der die Verarbeitung blockiert war, weil auf den Remote-Festplattenzugriff gewartet wurde. |
|
DOUBLE |
Zeit, in der die Verarbeitung auf den Netzwerk-Datentransfer gewartet hat. |
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.
Die Operatorattribute werden in der Spalte OPERATOR_ATTRIBUTES gespeichert, die vom Typ VARIANT ist und ein OBJECT enthält. Das OBJECT enthält Schlüssel/Wert-Paare. Jeder Schlüssel entspricht einem Attribut des Operators.
Operator name |
Schlüssel |
Data type |
Beschreibung |
|---|---|---|---|
|
|||
|
ARRAY von VARCHAR |
Liste der berechneten Funktionen. |
|
|
ARRAY von VARCHAR |
Group-by expression. |
|
|
|||
|
VARCHAR |
Join-Ausdruck, der auf Ungleichheit basiert |
|
|
VARCHAR |
Join-Ausdruck, der auf Gleichheit basiert |
|
|
VARCHAR |
Join-Typ (INNER) |
|
|
|
VARCHAR |
Name der aktualisierten Tabelle. |
|
|||
|
VARCHAR |
Name des Stagingbereichs, aus dem die Daten gelesen werden. |
|
|
VARCHAR |
Typ des Stagingbereichs. |
|
|
|
VARCHAR |
Der zum Filtern der Daten verwendete Ausdruck. |
|
|
VARCHAR |
Input expression used to flatten data. |
|
|||
|
NUMBER |
Wert des Eingabeparameters ROWCOUNT. |
|
|
NUMBER |
Wert des Eingabeparameters TIMELIMIT. |
|
|
|||
|
ARRAY von VARCHAR |
Liste der berechneten Funktionen. |
|
|
ARRAY von VARCHAR |
Liste der Gruppierungssätze. |
|
|
|||
|
VARCHAR |
Ausdrücke, die eingefügt werden. |
|
|
ARRAY von VARCHAR |
Liste der Tabellennamen, denen Datensätze hinzugefügt werden. |
|
|
|
VARCHAR |
Name of the accessed object. |
|
|||
|
VARCHAR |
Join-Ausdruck, der auf Ungleichheit basiert |
|
|
VARCHAR |
Join-Ausdruck, der auf Gleichheit basiert |
|
|
VARCHAR |
Join-Typ (INNER, OUTER, LEFT JOIN usw.). |
|
|
|
NUMBER |
Operator id of the join used to identify tuples that can be filtered out. |
|
|
VARCHAR |
Name der aktualisierten Tabelle. |
|
|||
|
ARRAY von VARCHAR |
Verbleibende Spalten, über die die Ergebnisse aggregiert werden. |
|
|
ARRAY von VARCHAR |
Resultierende Spalten der Pivot-Werte. |
|
|
|
ARRAY von VARCHAR |
Liste der Ausdrücke, die generiert wurden. |
|
|
ARRAY von VARCHAR |
Ausdruck, der die Sortierreihenfolge definiert. |
|
|||
|
NUMBER |
Position in der sortierten Sequenz, ab der die produzierten Tupel ausgegeben werden. |
|
|
NUMBER |
Anzahl der erzeugten Zeilen. |
|
|
ARRAY von VARCHAR |
Ausdruck, der die Sortierreihenfolge definiert. |
|
|
|||
|
ARRAY von VARCHAR |
Liste der gescannten Spalten. |
|
|
ARRAY von VARCHAR |
Liste der aus den Variantenspalten extrahierten Pfade. |
|
|
VARCHAR |
Alias der Tabelle, auf die zugegriffen wurde. |
|
|
VARCHAR |
Name der Tabelle, auf die zugegriffen wurde. |
|
|
|
VARCHAR |
Stagingbereich, in dem die Daten gespeichert werden. |
|
|
ARRAY von VARCHAR |
Ausgabespalten der Unpivot-Abfrage. |
|
|
VARCHAR |
Name der aktualisierten Tabelle. |
|
|||
|
NUMBER |
Anzahl der produzierten Werte. |
|
|
VARCHAR |
Liste der Werte. |
|
|
|
ARRAY von VARCHAR |
Liste der berechneten Funktionen. |
|
|
VARCHAR |
Alias der WITH-Klausel. |
Wenn ein Operator nicht aufgeführt ist, werden keine Attribute erzeugt, und der Wert wird als {} berichtet.
Bemerkung
The following operators do not have any operator attributes and therefore are not included in the table of
OPERATOR_ATTRIBUTES:UnionAllExternalFunction
Beispiele¶
Die folgenden Beispiele rufen die Funktion GET_QUERY_OPERATOR_STATS auf.
Abrufen von Daten zu einer einzelnen Abfrage¶
Dieses Beispiel zeigt die Statistiken für ein SELECT, das zwei kleine Tabellen miteinander verknüpft.
Führen Sie die SELECT-Anweisung aus:
SELECT x1.i, x2.i
FROM x1 INNER JOIN x2 ON x2.i = x1.i
ORDER BY x1.i, x2.i;
Rufen Sie die Abfrage-ID ab:
SET lqid = (SELECT LAST_QUERY_ID());
Rufen Sie GET_QUERY_OPERATOR_STATS() auf, um Statistiken zu den einzelnen Operatoren der Abfrage zu erhalten:
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 | | |
| | | | | | } | | |
| | | | | | } | | |
+--------------------------------------+---------+-------------+--------------------+---------------+-----------------------------------------+-----------------------------------------------+----------------------------------------------------------------------+
Identifizieren von „explodierenden“ Join-Operatoren¶
Das folgende Beispiel zeigt, wie mit GET_QUERY_OPERATOR_STATS eine komplizierte Abfrage untersucht werden kann. In diesem Beispiel wird nach Operatoren innerhalb einer Abfrage gesucht, die viel mehr Zeilen erzeugen, als für diesen Operator eingegeben wurden.
Folgende Abfrage wird analysiert:
SELECT *
FROM t1
JOIN t2 ON t1.a = t2.a
JOIN t3 ON t1.b = t3.b
JOIN t4 ON t1.c = t4.c;
Rufen Sie die Abfrage-ID der Abfrage ab:
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 |
+---------+-------------+--------------------------------------------------------------------------+---------------+
Nachdem Sie die explodierenden Joins identifiziert haben, können Sie jede Join-Bedingung überprüfen, um sicherzustellen, dass die Bedingung korrekt ist.