类别:

系统函数 (查询信息)、表函数

GET_QUERY_OPERATOR_STATS

返回有关已完成查询中各个查询运算符的统计信息。您可以对过去 14 天内执行的任何已完成的查询运行此函数。

您可以使用此信息来了解查询的结构,并识别引起性能问题的查询运算符(例如联接运算符)。

例如,您可以使用此信息来确定哪些运算符消耗的资源最多。另一个示例是,您可以使用此函数来识别输出行多于输入行的联接,这可能是 :ref:`“爆炸式”联接 <label-exploding_join>`(例如意外的笛卡尔积)的迹象。

Snowsight 中的 查询配置文件 选项卡中也提供了这些统计信息。GET_QUERY_OPERATOR_STATS() 函数通过编程接口提供相同的信息。

有关查找有问题的查询运算符的更多信息,请参阅 查询配置文件识别的常见查询问题

语法

GET_QUERY_OPERATOR_STATS( <query_id> )

实参

query_id

查询的 ID。您可以使用:

  • 字符串字面量(由单引号括起来的字符串)。

  • 包含查询 ID 的 会话变量

  • LAST_QUERY_ID 函数调用的返回值。

返回

GET_QUERY_OPERATOR_STATS 函数是一个 表函数。该函数返回包含有关查询中每个查询运算符的统计信息的行。有关更多信息,请参阅以下章节:使用说明输出

使用说明

  • 此函数仅返回已完成查询的统计信息。

  • 您必须具有运行查询的仓库的 OPERATE 或 MONITOR 权限。

  • 此函数提供有关指定查询中使用的每个查询运算符的详细统计信息。以下列表显示了可能的查询运算符:

    • Aggregate:对输入进行分组并计算聚合函数。

    • CartesianJoin:一种特殊类型的联接。

    • Delete:从表中移除记录。

    • ExternalFunction:表示外部函数执行的处理。

    • ExternalScan:表示对存储在暂存区对象中的数据的访问。

    • Filter:表示筛选行的操作。

    • Flatten:处理 VARIANT 记录,可能在指定路径上展平记录。

    • 生成器:使用 TABLE(GENERATOR(...)) 结构生成记录。

    • GroupingSets:表示 GROUPING SETS、ROLLUP 和 CUBE 等结构。

    • Insert:通过 INSERT 或 COPY 操作将记录添加到表中。

    • InternalObject:表示对内部数据对象的访问;例如,在 Information Schema 中或上一个查询的结果。

    • Join:在给定条件下组合两个输入。

    • JoinFilter:特殊筛选操作,用于移除识别为可能不符合查询计划中进一步联接条件的元组。

    • Merge:对表执行 MERGE 操作。

    • Pivot:将唯一值从一列转换为多列,并进行任何必要的聚合。

    • Result:返回查询结果。

    • Sort:对给定表达式的输入进行排序。

    • SortWithLimit:排序后生成输入序列的一部分,通常是 ORDER BY ... LIMIT ... OFFSET ... 构造的结果。

    • TableScan:表示对单个表的访问。

    • UnionAll:连接两个输入。

    • Unload:表示将数据从表导出到暂存区中的文件的 COPY 操作。

    • Unpivot:通过将列转换为行来旋转表。

    • Update:更新表中的记录。

    • ValuesClause:随 VALUES 子句提供的值列表。

    • WindowFunction:计算窗口函数。

    • WithClause:位于 SELECT 语句正文之前,并定义一个或多个 CTEs。

    • WithReference:WITH 子句的实例。

  • 信息以表的形式返回。表中的每一行对应一个运算符。行包含该运算符的执行细分和查询统计信息。

    该行还可以列出 操作符属性 (这些属性取决于操作符的类型)。

    细分查询执行时间的统计信息以占总查询执行时间的百分比表示。

    有关特定统计信息的更多信息,请参阅 输出 (本主题内容)。

  • 因为此函数是表函数,所以必须在 FROM 子句中使用它,并且必须将它封装在 TABLE() 中。例如:

    SELECT * FROM TABLE(GET_QUERY_OPERATOR_STATS(last_query_id()));
    
  • 对于特定查询(即特定 UUID)的每次单独执行,此函数是确定性函数;它每次都返回相同的值。

    但是,对于同一查询文本的不同执行,此函数可以返回不同的运行时统计信息。统计信息取决于许多因素。以下因素可能会对执行产生重大影响,从而影响此函数返回的统计信息:

    • 数据量。

    • 物化视图 的可用性,以及自上次刷新这些物化视图以来对数据所做的更改(如果有)。

    • 是否存在 群集

    • 是否存在以前缓存的数据。

    • 虚拟仓库的大小。

    值还可能受到用户查询和数据之外的因素的影响。这些因素通常很小。这些因素包括:

    • 虚拟仓库初始化时间。

    • 外部函数的延迟。

输出

该函数返回以下列:

列名称

数据类型

描述

QUERY_ID

VARCHAR

查询 ID,它是 SQL 语句的内部系统生成的标识符。

STEP_ID

NUMBER(38, 0)

查询计划中步骤的标识符。

OPERATOR_ID

NUMBER(38, 0)

运算符的标识符。这在查询中是唯一的。值从 0 开始。

PARENT_OPERATORS

包含一个或多个 NUMBER(38, 0) 的 ARRAY

此运算符的父运算符的标识符;如果这是查询计划中的最后一个运算符(通常是 Result 运算符),则值为 NULL。

OPERATOR_TYPE

VARCHAR

查询运算符的类型;例如 TableScanFilter

OPERATOR_STATISTICS

包含 OBJECT 的 VARIANT

有关运算符的统计信息(例如,该运算符输出的行数)。

EXECUTION_TIME_BREAKDOWN

包含 OBJECT 的 VARIANT

有关运算符执行时间的信息。

OPERATOR_ATTRIBUTES

包含 OBJECT 的 VARIANT

有关运算符的信息。此信息取决于运算符类型。

如果运算符的特定列没有信息,则值为 NULL。

其中三列包含 OBJECTs。每个对象都包含键/值对。下表描述了这些对象中的键。

OPERATOR_STATISTICS

OPERATOR_STATISTICS 列的 OBJECTs 中的字段提供有关运算符的其他信息。这些信息可以包括:

嵌套键(如果适用)

数据类型

描述

dml

数据操作语言 (DML) 查询的统计信息。

number_of_rows_inserted

DOUBLE

插入到一个或多个表中的行数。

number_of_rows_updated

DOUBLE

表中更新的行数。

number_of_rows_deleted

DOUBLE

从表中删除的行数。

number_of_rows_unloaded

DOUBLE

数据导出期间卸载的行数。

extension_functions

与调用扩展函数有关的信息。如果字段的值为零,则不显示该字段。

Java UDF handler load time

DOUBLE

Java UDF 处理程序的加载时长。

Total Java UDF handler invocations

DOUBLE

Java UDF 处理程序的调用次数。

Max Java UDF handler execution time

DOUBLE

Java UDF 处理程序执行的最大时长。

Avg Java UDF handler execution time

DOUBLE

执行 Java UDF 处理程序的平均时长。

Java UDTF process() invocations

DOUBLE

Java UDTF process 方法 的调用次数。

Java UDTF process() execution time

DOUBLE

执行 Java UDTF process 的时长。

Avg Java UDTF process() execution time

DOUBLE

执行 Java UDTF process 的平均时长。

Java UDTF's constructor invocations

DOUBLE

Java UDTF 构造函数 的调用次数。

Java UDTF's constructor execution time

DOUBLE

执行 Java UDTF 构造函数的时长。

Avg Java UDTF's constructor execution time

DOUBLE

执行 Java UDTF 构造函数的平均时长。

Java UDTF endPartition() invocations

DOUBLE

Java UDTF endPartition 方法 的调用次数。

Java UDTF endPartition() execution time

DOUBLE

执行 Java UDTF endPartition 方法的时长。

Avg Java UDTF endPartition() execution time

DOUBLE

执行 Java UDTF endPartition 方法的平均时长。

Max Java UDF dependency download time

DOUBLE

下载 Java UDF 依赖项的最大时长。

Max JVM memory usage

DOUBLE

JVM 报告的内存使用峰值。

Java UDF inline code compile time in ms

DOUBLE

Java UDF 内联代码的编译时间。

Total Python UDF handler invocations

DOUBLE

Python UDF 处理程序的调用次数。

Total Python UDF handler execution time

DOUBLE

Python UDF 处理程序的总执行时间。

Avg Python UDF handler execution time

DOUBLE

执行 Python UDF 处理程序的平均时长。

Python sandbox max memory usage

DOUBLE

Python 沙盒环境的内存使用峰值。

Avg Python env creation time: Download and install packages

DOUBLE

创建 Python 环境(包括下载和安装包)的平均时长。

Conda solver time

DOUBLE

运行 Conda 求解器以解析 Python 包所需的时长。

Conda env creation time

DOUBLE

创建 Python 环境的时长。

Python UDF initialization time

DOUBLE

初始化 Python UDF 的时长。

Number of external file bytes read for UDFs

DOUBLE

为 UDFs 读取的外部文件字节数。

Number of external files accessed for UDFs

DOUBLE

为 UDFs 访问的外部文件数。

external_functions

与调用外部函数有关的信息。如果某个字段(例如 retries_due_to_transient_errors)的值为零,则不显示该字段。

total_invocations

DOUBLE

外部函数的调用次数。该数字可能与 SQL 语句文本中的外部函数调用次数不同,原因包括行被划分的批次数量、发生瞬态网络问题时的重试次数等。

rows_sent

DOUBLE

发送到外部函数的行数。

rows_received

DOUBLE

从外部函数接收回的行数。

bytes_sent (x-region)

DOUBLE

发送到外部函数的字节数。如果键包含 (x-region),则说明数据是跨区域发送的,这可能会影响计费。

bytes_received (x-region)

DOUBLE

从外部函数接收的字节数。如果键包含 (x-region),则说明数据是跨区域发送的,这可能会影响计费。

retries_due_to_transient_errors

DOUBLE

因瞬态错误而重试的次数。

average_latency_per_call

DOUBLE

从 Snowflake 发送数据到接收返回数据之间,每次调用 (call) 的平均时长(以毫秒为单位)。

http_4xx_errors

INTEGER

返回 4xx 状态代码的 HTTP 请求的总数。

http_5xx_errors

INTEGER

返回 5xx 状态代码的 HTTP 请求的总数。

average_latency

DOUBLE

成功 HTTP 请求的平均延迟。

avg_throttle_latency_overhead

DOUBLE

由于节流 (HTTP 429) 导致速度减慢,为每个成功请求带来的平均开销。

batches_retried_due_to_throttling

DOUBLE

因 HTTP 429 错误而重试的批次数量。

latency_per_successful_call_(p50)

DOUBLE

成功 HTTP 请求的第 50 个百分位延迟。在所有成功请求中,有 50% 的请求完成时间少于此时间。

latency_per_successful_call_(p90)

DOUBLE

成功 HTTP 请求的第 90 个百分位延迟。在所有成功请求中,有 90% 的请求完成时间少于此时间。

latency_per_successful_call_(p95)

DOUBLE

成功 HTTP 请求的第 95 个百分位延迟。在所有成功请求中,有 95% 的请求完成时间少于此时间。

latency_per_successful_call_(p99)

DOUBLE

成功 HTTP 请求的第 99 个百分位延迟。在所有成功请求中,有 99% 的请求完成时间少于此时间。

input_rows

INTEGER

输入行数。对于没有来自其他运算符的输入边的运算符,这可能是缺失的。

io

有关查询期间执行的 I/O(输入/输出)操作的信息:

scan_progress

DOUBLE

到目前为止,给定表已扫描的数据百分比。

bytes_scanned

DOUBLE

到目前为止扫描的字节数。

percentage_scanned_from_cache

DOUBLE

从本地磁盘缓存扫描的数据所占的百分比。

bytes_written

DOUBLE

写入的字节数;例如,加载到表中时。

bytes_written_to_result

DOUBLE

写入结果对象的字节数。

例如,SELECT * FROM ... 将生成一组表格格式的结果,表示所选内容中的每个字段。

通常,结果对象表示作为查询结果生成的任何内容,bytes_written_to_result 表示返回结果的大小。

bytes_read_from_result

DOUBLE

从结果对象中读取的字节数。

external_bytes_scanned

DOUBLE

从外部对象(例如暂存区)读取的字节数。

network

network_bytes

DOUBLE

通过网络发送的数据量。

output_rows

INTEGER

输出行数。对于向用户返回结果的运算符(通常是 RESULT 运算符),该信息可能会缺失。

pruning

有关表修剪的信息。

partitions_pruned_by_snowflake_optima

DOUBLE

被 Snowflake Optima 修剪的分区数。

partitions_scanned

DOUBLE

到目前为止扫描的分区数。

partitions_total

DOUBLE

给定表的分区总数。

spilling

有关中间结果不适合内存的操作的磁盘使用情况的信息。

bytes_spilled_remote_storage

DOUBLE

溢出到远程磁盘的数据量。

bytes_spilled_local_storage

DOUBLE

溢出到本地磁盘的数据量。

search_optimization

有关使用 搜索优化服务 的查询信息。

partitions_pruned_by_search_optimization

DOUBLE

通过搜索优化修剪的分区数。

partitions_pruned_by_search_optimization_and_snowflake_optima

DOUBLE

通过搜索优化和 Snowflake Optima 修剪的分区数。

EXECUTION_TIME_BREAKDOWN

EXECUTION_TIME_BREAKDOWN 列的 OBJECTs 中的字段如下所示。

数据类型

描述

overall_percentage

DOUBLE

该运算符占查询总时间的百分比。

initialization

DOUBLE

设置查询处理所用的时间。

processing

DOUBLE

CPU 处理数据所用的时间。

synchronization

DOUBLE

同步参与进程之间的活动所用的时间。

local_disk_io

DOUBLE

等待本地磁盘访问时阻止处理的时间。

remote_disk_io

DOUBLE

等待远程磁盘访问时阻止处理的时间。

network_communication

DOUBLE

处理等待网络数据传输的时间。

OPERATOR_ATTRIBUTES

每个输出行描述查询中的一个运算符。下表显示了可能的运算符类型;例如 Filter(筛选器)运算符。对于每种类型的运算符,表中显示了可能的属性;例如,用于筛选行的表达式。

运算符属性存储在 OPERATOR_ATTRIBUTES 列中,该列的类型为 VARIANT 并且包含 OBJECT。OBJECT 包含键值对。每个键对应运算符的一个属性。

运算符名称

数据类型

描述

Aggregate

functions

VARCHAR 的 ARRAY

计算的函数列表。

grouping_keys

VARCHAR 的 ARRAY

分组依据表达式。

CartesianJoin

additional_join_condition

VARCHAR

非相等联接表达式。

equality_join_condition

VARCHAR

相等联接表达式。

join_type

VARCHAR

联接 (INNER) 的类型。

Delete

table_name

VARCHAR

更新表的名称。

ExternalScan

stage_name

VARCHAR

从中读取数据的暂存区的名称。

stage_type

VARCHAR

暂存区的类型。

Filter

filter_condition

VARCHAR

用于筛选数据的表达式。

Flatten

input

VARCHAR

用于展平数据的输入表达式。

Generator

row_count

NUMBER

输入参数 ROWCOUNT 的值。

time_limit

NUMBER

输入参数 TIMELIMIT 的值。

GroupingSets

functions

VARCHAR 的 ARRAY

计算的函数列表。

key_sets

VARCHAR 的 ARRAY

分组集的列表。

Insert

input_expression

VARCHAR

插入了哪些表达式。

table_names

VARCHAR 的 ARRAY

添加记录的表名列表。

InternalObject

object_name

VARCHAR

被访问对象的名称。

Join

additional_join_condition

VARCHAR

非相等联接表达式。

equality_join_condition

VARCHAR

相等联接表达式。

join_type

VARCHAR

联接的类型(INNER、OUTER、LEFT JOIN 等)。

JoinFilter

join_id

NUMBER

用于标识可过滤掉元组的联接运算符 ID。

Merge

table_name

VARCHAR

更新表的名称。

Pivot

grouping_keys

VARCHAR 的 ARRAY

聚合结果的其余列。

pivot_column

VARCHAR 的 ARRAY

生成的透视值列。

Result

expressions

VARCHAR 的 ARRAY

生成的表达式列表。

Sort

sort_keys

VARCHAR 的 ARRAY

定义排序顺序的表达式。

SortWithLimit

offset

NUMBER

生成的元组在已排列序列中的发出位置。

rows

NUMBER

生成的行数。

sort_keys

VARCHAR 的 ARRAY

定义排序顺序的表达式。

TableScan

columns

VARCHAR 的 ARRAY

已扫描列的列表

extracted_variant_paths

VARCHAR 的 ARRAY

从变体列提取的路径列表。

table_alias

VARCHAR

正在访问的表的别名。

table_name

VARCHAR

正在访问的表的名称。

Unload

location

VARCHAR

保存数据的暂存区。

Unpivot

expressions

VARCHAR 的 ARRAY

取消透视查询的输出列。

Update

table_name

VARCHAR

更新表的名称。

ValuesClause

value_count

NUMBER

生成的值的数量。

values

VARCHAR

值的列表。

WindowFunction

functions

VARCHAR 的 ARRAY

计算的函数列表。

WithClause

name

VARCHAR

WITH 子句的别名。

如果未列出运算符,则不生成任何属性,并将值报告为 {}

备注

  • 以下运算符没有任何运算符属性,因此未包含在 OPERATOR_ATTRIBUTES 中:

    • UnionAll

    • ExternalFunction

示例

以下示例调用 GET_QUERY_OPERATOR_STATS 函数。

检索关于单个查询的数据

此示例显示了联接两个小表的 SELECT 的统计信息。

运行 SELECT 语句:

SELECT x1.i, x2.i
  FROM x1 INNER JOIN x2 ON x2.i = x1.i
  ORDER BY x1.i, x2.i;

获取查询 ID:

SET lqid = (SELECT LAST_QUERY_ID());

调用 GET_QUERY_OPERATOR_STATS() 获取有关查询中各个查询运算符的统计信息:

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               |                                               |                                                                      |
|                                      |         |             |                    |               |   }                                     |                                               |                                                                      |
|                                      |         |             |                    |               | }                                       |                                               |                                                                      |
+--------------------------------------+---------+-------------+--------------------+---------------+-----------------------------------------+-----------------------------------------------+----------------------------------------------------------------------+

识别“分解”联接运算符

以下示例演示了如何使用 GET_QUERY_OPERATOR_STATS 检查复杂查询。此示例在查询中查找生成的行数比输入到该运算符的行数多的运算符。

这是要分析的查询:

SELECT *
  FROM t1
    JOIN t2 ON t1.a = t2.a
    JOIN t3 ON t1.b = t3.b
    JOIN t4 ON t1.c = t4.c;

获取上一个查询的查询 ID :

SET lid = LAST_QUERY_ID();

以下查询显示了查询中每个联接运算符的输出行与输入行的比率:

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  |
+---------+-------------+--------------------------------------------------------------------------+---------------+

识别分解联接后,可以查看每个联接条件以验证条件是否正确。