EXPLAIN¶
返回指定 SQL 语句的逻辑执行计划。
解释计划会显示 Snowflake 为执行查询而执行的操作(例如,表扫描和联接)。
语法¶
EXPLAIN [ USING { TABULAR | JSON | TEXT } ] <statement>
参数¶
statement
这是您需要解释计划的 SQL 语句。
USING output_format
此可选子句指定输出格式。可能的输出格式包括:
JSON:JSON 输出更易于存储在表和查询中。
TABULAR:表格输出通常比 JSON 输出更易于人类阅读。
TEXT:格式化的文本输出通常比 JSON 输出更易于人类阅读。
默认为 TABULAR。
输出¶
输出包含以下信息:
列 |
描述 |
---|---|
|
大多数查询均包含单独一个步骤,但有些查询会以多个不同步骤的形式执行。此列指示操作属于哪个步骤。 |
|
分配给查询计划中各操作的唯一标识符。 |
|
操作的父节点标识符构成的数组。在查询配置文件中,父项显示在其子项上方,并带有将两者相连的链接。 |
|
操作的名称,例如 Result、Filter、TableScan、Join 等。 |
|
表扫描操作所引用的对象(例如表、物化视图或安全视图)的名称。 |
|
所引用对象的别名(如果在查询中为该对象指定了别名)。 |
|
与当前操作相关的表达式列表,例如筛选、连接谓词、预测、汇总等。 |
|
所引用的数据库对象中的微分区总数。 |
|
在编译时修剪后,所引用对象中剩余的分区数,即查询可能扫描的分区数。 |
|
assignedPartitions 中包含的字节数。 |
使用说明¶
EXPLAIN 编译 SQL 语句,但不会执行此语句,因此 EXPLAIN 不需要正在运行的仓库。
尽管 EXPLAIN 不会耗费任何计算 Credit,但查询的编译确实会耗费云服务 Credit,就像其他元数据操作一样。
若要对此命令的输出进行后处理,可以执行以下操作:
使用 RESULT_SCAN 函数,该函数将输出视为可查询的表。
以 JSON 格式生成输出,并将 JSON 格式化的输出插入到表中,以便稍后进行分析。如果以 JSON 格式存储输出,则可以使用函数 SYSTEM$EXPLAIN_JSON_TO_TEXT 或 EXPLAIN_JSON 将 JSON 转换为更易于阅读的格式(表格或格式化文本)。
assignedPartitions 和 assignedBytes 值是查询执行的上限预估值。运行时优化(如联接修剪)可减少查询执行期间扫描的分区数和字节数。
EXPLAIN 计划是“逻辑”解释计划。它显示了要执行的操作,及其之间的逻辑关系。计划中操作的实际执行顺序与计划显示的逻辑顺序不一定相符。
如果 EXPLAIN 语句中的任何数据库对象为 INFORMATION_SCHEMA 对象,该语句将失败并显示错误
EXPLAIN command has insufficient privilege on object <objName>
。
示例¶
此示例显示针对两个小型表的简单查询的 EXPLAIN 输出。
创建表:
CREATE TABLE Z1 (ID INTEGER); CREATE TABLE Z2 (ID INTEGER); CREATE TABLE Z3 (ID INTEGER);以表格格式为查询生成 EXPLAIN 计划:
EXPLAIN USING TABULAR SELECT Z1.ID, Z2.ID FROM Z1, Z2 WHERE Z2.ID = Z1.ID; +------+------+-----------------+-------------+------------------------------+-------+--------------------------+-----------------+--------------------+---------------+ | step | id | parentOperators | operation | objects | alias | expressions | partitionsTotal | partitionsAssigned | bytesAssigned | |------+------+-----------------+-------------+------------------------------+-------+--------------------------+-----------------+--------------------+---------------| | NULL | NULL | NULL | GlobalStats | NULL | NULL | NULL | 2 | 2 | 1024 | | 1 | 0 | NULL | Result | NULL | NULL | Z1.ID, Z2.ID | NULL | NULL | NULL | | 1 | 1 | [0] | InnerJoin | NULL | NULL | joinKey: (Z2.ID = Z1.ID) | NULL | NULL | NULL | | 1 | 2 | [1] | TableScan | TESTDB.TEMPORARY_DOC_TEST.Z2 | NULL | ID | 1 | 1 | 512 | | 1 | 3 | [1] | JoinFilter | NULL | NULL | joinKey: (Z2.ID = Z1.ID) | NULL | NULL | NULL | | 1 | 4 | [3] | TableScan | TESTDB.TEMPORARY_DOC_TEST.Z1 | NULL | ID | 1 | 1 | 512 | +------+------+-----------------+-------------+------------------------------+-------+--------------------------+-----------------+--------------------+---------------+为查询生成格式化文本形式的 EXPLAIN 计划:
EXPLAIN USING TEXT SELECT Z1.ID, Z2.ID FROM Z1, Z2 WHERE Z2.ID = Z1.ID; +------------------------------------------------------------------------------------------------------------------------------------+ | content | |------------------------------------------------------------------------------------------------------------------------------------| | GlobalStats: | | partitionsTotal=2 | | partitionsAssigned=2 | | bytesAssigned=1024 | | Operations: | | 1:0 ->Result Z1.ID, Z2.ID | | 1:1 ->InnerJoin joinKey: (Z2.ID = Z1.ID) | | 1:2 ->TableScan TESTDB.TEMPORARY_DOC_TEST.Z2 ID {partitionsTotal=1, partitionsAssigned=1, bytesAssigned=512} | | 1:3 ->JoinFilter joinKey: (Z2.ID = Z1.ID) | | 1:4 ->TableScan TESTDB.TEMPORARY_DOC_TEST.Z1 ID {partitionsTotal=1, partitionsAssigned=1, bytesAssigned=512} | | | +------------------------------------------------------------------------------------------------------------------------------------+为查询生成 JSON 形式的 EXPLAIN 计划:
EXPLAIN USING JSON SELECT Z1.ID, Z2.ID FROM Z1, Z2 WHERE Z2.ID = Z1.ID; +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | content | |---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | {"GlobalStats":{"partitionsTotal":2,"partitionsAssigned":2,"bytesAssigned":1024},"Operations":[[{"id":0,"operation":"Result","expressions":["Z1.ID","Z2.ID"]},{"id":1,"parentOperators":[0],"operation":"InnerJoin","expressions":["joinKey: (Z2.ID = Z1.ID)"]},{"id":2,"parentOperators":[1],"operation":"TableScan","objects":["TESTDB.TEMPORARY_DOC_TEST.Z2"],"expressions":["ID"],"partitionsAssigned":1,"partitionsTotal":1,"bytesAssigned":512},{"id":3,"parentOperators":[1],"operation":"JoinFilter","expressions":["joinKey: (Z2.ID = Z1.ID)"]},{"id":4,"parentOperators":[3],"operation":"TableScan","objects":["TESTDB.TEMPORARY_DOC_TEST.Z1"],"expressions":["ID"],"partitionsAssigned":1,"partitionsTotal":1,"bytesAssigned":512}]]} | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+