EXPLAIN

返回指定 SQL 语句的逻辑执行计划。

解释计划会显示 Snowflake 为执行查询而执行的操作(例如,表扫描和联接)。

另请参阅:

SYSTEM$EXPLAIN_PLAN_JSONSYSTEM$EXPLAIN_JSON_TO_TEXTEXPLAIN_JSON

语法

EXPLAIN [ USING { TABULAR | JSON | TEXT } ] <statement>
Copy

参数

statement

这是您需要解释计划的 SQL 语句。

USING output_format

此可选子句指定输出格式。可能的输出格式包括:

  • JSON:JSON 输出更易于存储在表和查询中。

  • TABULAR:表格输出通常比 JSON 输出更易于人类阅读。

  • TEXT:格式化的文本输出通常比 JSON 输出更易于人类阅读。

默认为 TABULAR。

输出

输出包含以下信息:

描述

step

大多数查询均包含单独一个步骤,但有些查询会以多个不同步骤的形式执行。此列指示操作属于哪个步骤。

id

分配给查询计划中各操作的唯一标识符。

parentOperators

操作的父节点标识符构成的数组。在查询配置文件中,父项显示在其子项上方,并带有将两者相连的链接。

operation

操作的名称,例如 Result、Filter、TableScan、Join 等。

objects

表扫描操作所引用的对象(例如表、物化视图或安全视图)的名称。

alias

所引用对象的别名(如果在查询中为该对象指定了别名)。

expressions

与当前操作相关的表达式列表,例如筛选、连接谓词、预测、汇总等。

totalPartitions

所引用的数据库对象中的微分区总数。

assignedPartitions

在编译时修剪后,所引用对象中剩余的分区数,即查询可能扫描的分区数。

assignedBytes

assignedPartitions 中包含的字节数。

使用说明

  • EXPLAIN 编译 SQL 语句,但不会执行此语句,因此 EXPLAIN 不需要正在运行的仓库。

  • 尽管 EXPLAIN 不会耗费任何计算 Credit,但查询的编译确实会耗费云服务 Credit,就像其他元数据操作一样。

  • 若要对此命令的输出进行后处理,可以执行以下操作:

    • 使用 RESULT_SCAN 函数,该函数将输出视为可查询的表。

    • 以 JSON 格式生成输出,并将 JSON 格式化的输出插入到表中,以便稍后进行分析。如果以 JSON 格式存储输出,则可以使用函数 SYSTEM$EXPLAIN_JSON_TO_TEXTEXPLAIN_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);
Copy

以表格格式为查询生成 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 |
+------+------+-----------------+-------------+------------------------------+-------+--------------------------+-----------------+--------------------+---------------+
Copy

为查询生成格式化文本形式的 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} |
|                                                                                                                                    |
+------------------------------------------------------------------------------------------------------------------------------------+
Copy

为查询生成 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}]]} |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
Copy
语言: 中文