基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
EXPLAIN
更新时间:2023-08-03 17:20:32
描述
该语句用于解释 SQL 语句的执行计划,可以是 SELECT、DELETE、INSERT、REPLACE 或 UPDATE 语句。
EXPLAIN 与 DESCRIBE、DESC 互为同义词。
语法
{EXPLAIN | DESCRIBE | DESC} [explain_type] dml_statement;
explain_type:
BASIC
| OUTLINE
| EXTENDED
| EXTENDED_NOADDR
| PARTITIONS
| FORMAT = {TRADITIONAL| JSON}
dml_statement:
SELECT statement
| DELETE statement
| INSERT statement
| REPLACE statement
参数解释
| 参数 | 描述 |
|---|---|
| BASIC | 指定输出计划的基础信息,如算子 ID、算子名称、所引用的表名。 |
| OUTLINE | 指定输出的计划信息包含 OUTLINE 信息。 |
| EXTENDED | EXPLAIN 产生附加信息,包括:每个算子的输入列和输出列,访问表的分区信息,当前使用的 Filter 信息,如果当前算子使用了索引,显示所使用的索引列及抽取的 Query Range。 |
| EXTENDED_NOADDR | 以简约的方式展示附加信息。 |
| PARTITIONS | 显示分区相关信息。 |
| FORMAT = {TRADITIONAL| JSON} | 指定 EXPALIN 的输出格式:
|
示例
省略
explain_type,返回语句的执行计划。obclient> EXPLAIN SELECT * FROM t1,t2 WHERE t1.c2=t2.c2 AND t2.c1 > 4\G *************************** 1. row *************************** Query Plan: ======================================= |ID|OPERATOR |NAME|EST. ROWS|COST | --------------------------------------- |0 |HASH JOIN | |9801000 |5933109| |1 | TABLE SCAN|t2 |10000 |6219 | |2 | TABLE SCAN|t1 |100000 |68478 | ======================================= Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c2], [t2.c1], [t2.c2]), filter(nil), equal_conds([t1.c2 = t2.c2]), other_conds(nil) 1 - output([t2.c2], [t2.c1]), filter(nil), access([t2.c2], [t2.c1]), partitions(p0) 2 - output([t1.c2], [t1.c1]), filter(nil), access([t1.c2], [t1.c1]), partitions(p0)通过
EXTENDED_NOADDR关键字输出附加信息。obclient> EXPLAIN EXTENDED_NOADDR SELECT * FROM t1,t2 WHERE t1.c2=t2.c2 AND t2.c1 > 4\G *************************** 1. row *************************** Query Plan: ======================================= |ID|OPERATOR |NAME|EST. ROWS|COST | --------------------------------------- |0 |HASH JOIN | |9801000 |5933109| |1 | TABLE SCAN|t2 |10000 |6219 | |2 | TABLE SCAN|t1 |100000 |68478 | ======================================= Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c2], [t2.c1], [t2.c2]), filter(nil), equal_conds([t1.c2 = t2.c2]), other_conds(nil) 1 - output([t2.c2], [t2.c1]), filter(nil), access([t2.c2], [t2.c1]), partitions(p0), is_index_back=false, range_key([t2.c1]), range(4 ; MAX), range_cond([t2.c1 > 4]) 2 - output([t1.c2], [t1.c1]), filter(nil), access([t1.c2], [t1.c1]), partitions(p0), is_index_back=false, range_key([t1.__pk_increment], [t1.__pk_cluster_id], [t1.__pk_partition_id]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true展示
TRADITIONAL格式的执行计划。obclient> EXPLAIN FORMAT=TRADITIONAL SELECT * FROM t1,t2 WHERE t1.c2=t2.c2 AND t2.c1 > 4\G *************************** 1. row *************************** Query Plan: ======================================= |ID|OPERATOR |NAME|EST. ROWS|COST | --------------------------------------- |0 |HASH JOIN | |9801000 |5933109| |1 | TABLE SCAN|t2 |10000 |6219 | |2 | TABLE SCAN|t1 |100000 |68478 | ======================================= Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c2], [t2.c1], [t2.c2]), filter(nil), equal_conds([t1.c2 = t2.c2]), other_conds(nil) 1 - output([t2.c2], [t2.c1]), filter(nil), access([t2.c2], [t2.c1]), partitions(p0) 2 - output([t1.c2], [t1.c1]), filter(nil), access([t1.c2], [t1.c1]), partitions(p0)展示
JSON格式的执行计划。obclient> EXPLAIN FORMAT=JSON SELECT * FROM t1,t2 WHERE t1.c2=t2.c2 AND t2.c1 > 4\G *************************** 1. row *************************** Query Plan: { "ID":2, "OPERATOR":"JOIN", "NAME":"JOIN", "EST.ROWS":9800999, "COST":5933108, "output": [ "t1.c1", "t1.c2", "t2.c1", "t2.c2" ], "TABLE SCAN": { "ID":0, "OPERATOR":"TABLE SCAN", "NAME":"TABLE SCAN", "EST.ROWS":10000, "COST":6218, "output": [ "t2.c2", "t2.c1" ] }, "TABLE SCAN": { "ID":1, "OPERATOR":"TABLE SCAN", "NAME":"TABLE SCAN", "EST.ROWS":100000, "COST":68477, "output": [ "t1.c2", "t1.c1" ] } }