- 类别:
SYSTEM$EXPLAIN_PLAN_JSON¶
给定 SQL 语句的文本,此函数会生成 JSON 格式的 EXPLAIN 执行计划。
语法¶
SYSTEM$EXPLAIN_PLAN_JSON( { <sql_statement_expression> | <sql_query_id_expression> } )
实参¶
sql_statement_expression
字符串或计算结果为字符串的表达式,其中包含要为其生成 EXPLAIN 执行计划的 SQL 语句。如果使用字面量字符串,则应该放在单引号字符
'
内。sql_query_id_expression
字符串或计算结果为字符串的表达式,其中包含要为其生成 EXPLAIN 执行计划的查询 ID。如果使用字面量字符串,则应该放在单引号字符
'
内。Snowflake 可保留过去 14 天内执行的查询 IDs 的历史数据。如果您指定的查询 ID 对应于早于过去 14 天执行的查询,则会返回错误。有关更多信息,请参阅 使用 Query History 监控查询活动。
返回¶
该函数返回 VARCHAR,其中包含 JSON 兼容格式的 EXPLAIN 输出。
使用说明¶
如果字符串字面量作为输入传递,字符串周围的分隔符可以是单引号
'
或双美元符号$$
。如果字符串字面量包含单引号(并且不包含双美元符号),则通过使用双美元符号分隔字符串,便无需将字符串中嵌入的单引号字符进行转义。若要对此命令的输出进行后处理,可以执行以下操作:
使用 RESULT_SCAN 函数,该函数将输出视为可查询的表。
将 JSON 格式化的输出插入到表格中,以便稍后进行分析。如果以 JSON 格式存储输出,则可以使用函数 SYSTEM$EXPLAIN_JSON_TO_TEXT 或 EXPLAIN_JSON 将 JSON 转换为更易于阅读的格式(表格或格式化文本)。
示例¶
这些示例使用如下所示的表:
CREATE TABLE Z1 (ID INTEGER); CREATE TABLE Z2 (ID INTEGER); CREATE TABLE Z3 (ID INTEGER);
此示例使用包含 n SQL 语句的字面量字符串作为输入参数:
SELECT SYSTEM$EXPLAIN_PLAN_JSON( 'SELECT Z1.ID, Z2.ID FROM Z1, Z2 WHERE Z2.ID = Z1.ID' ) AS explain_plan; +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | EXPLAIN_PLAN | |---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | {"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}]]} | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
使用 $$
来分隔包含单引号的查询:
SELECT SYSTEM$EXPLAIN_PLAN_JSON( $$ SELECT symptom, IFNULL(diagnosis, '(not yet diagnosed)') FROM medical $$ );
以下代码演示了如何查看已执行的查询的 EXPLAIN 计划:
运行查询:
SELECT Z1.ID, Z2.ID FROM Z1, Z2 WHERE Z2.ID = Z1.ID;在查询中运行 EXPLAIN,调用
LAST_QUERY_ID()
以查找查询 ID:SELECT SYSTEM$EXPLAIN_PLAN_JSON(LAST_QUERY_ID()) AS explain_plan;