基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
查看查询执行计划
更新时间:2025-03-11 16:26:06
OceanBase 的 SQL 引擎支持执行计划解析和缓存技术,可以通过分析查询语句的执行计划来分析查询性能。
执行计划是对一条 SQL 查询语句在数据库中执行过程的描述,通常用于分析某条 SQL 的性能问题,读懂执行计划是 SQL 优化的先决条件。用户可以通过 EXPLAIN 命令查看优化器针对指定 SQL 生成的逻辑执行计划。
EXPLAIN 命令格式
OceanBase 数据库的执行计划命令有三种模式:EXPLAIN BASIC、EXPLAIN 和 EXPLAIN EXTENDED。这三种模式对执行计划展现不同粒度的细节信息:
EXPLAIN BASIC命令用于最基本的计划展示。EXPLAIN EXTENDED命令用于最详细的计划展示(通常在排查问题时使用这种展示模式)。EXPLAIN命令所展示的信息可以帮助普通用户了解整个计划的执行方式。
语法
EXPLAIN [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
| UPDATE statement
EXPLAIN 命令适用于 SELECT、DELETE、INSERT、REPLACE 和 UPDATE 语句,显示优化器所提供的有关语句执行计划的信息,包括如何处理该语句,如何联接表以及以何种顺序联接表等信息。
一般来说,可以使用 EXPLAIN EXTENDED 命令,将表扫描的范围段展示出来。使用 EXPLAIN OUTLINE 命令可以显示 Outline 信息。
FORMAT 选项可用于选择输出格式。TRADITIONAL 表示以表格格式显示输出,这也是默认设置。JSON 表示以 JSON 格式显示信息。
使用 EXPLAIN PARTITIONS 也可用于检查涉及分区表的查询。如果检查针对非分区表的查询,则不会产生错误,但 PARTITIONS 列的值始终为 NULL。
使用 ODC 查看执行计划示例
在 ODC 平台的 SQL 窗口,运行 EXPLAIN 命令在结果 1 区域中单击
,查看执行计划信息。
使用
EXPLAIN BASIC命令展示执行计划。
使用
EXPLAIN命令展示执行计划。
使用
EXPLAIN EXTENDED命令展示执行计划。
使用
EXPLAIN EXTENDED_NOADDR命令展示执行计划。
使用
EXPLAIN OUTLINE命令可以显示 Outline 信息。
使用黑屏环境查看执行计划示例
使用
EXPLAIN BASIC命令展示执行计划。obclient> CREATE TABLE t511(a INT PRIMARY KEY, b INT, c INT); Query OK, 0 rows affected obclient> CREATE TABLE t512(a INT PRIMARY KEY, b INT, c INT); Query OK, 0 rows affected obclient> EXPLAIN BASIC SELECT * FROM t511,t512 WHERE t511.a = t512.a\G *************************** 1. row *************************** Query Plan: ========================== |ID|OPERATOR |NAME| -------------------------- |0 |NESTED-LOOP JOIN| | |1 | TABLE SCAN |T511| |2 | TABLE GET |T512| ========================== Outputs & filters: ------------------------------------- 0 - output([T511.A], [T511.B], [T511.C], [T512.A], [T512.B], [T512.C]), filter(nil), conds(nil), nl_params_([T511.A]) 1 - output([T511.A], [T511.B], [T511.C]), filter(nil), access([T511.A], [T511.B], [T511.C]), partitions(p0) 2 - output([T512.A], [T512.B], [T512.C]), filter(nil), access([T512.A], [T512.B], [T512.C]), partitions(p0) 1 row in set使用
EXPLAIN命令展示执行计划。obclient> EXPLAIN SELECT * FROM t511,t512 WHERE t511.a = t512.a\G *************************** 1. row *************************** Query Plan: ========================================= |ID|OPERATOR |NAME|EST. ROWS|COST| ----------------------------------------- |0 |NESTED-LOOP JOIN| |1 |53 | |1 | TABLE SCAN |T511|1 |46 | |2 | TABLE GET |T512|1 |7 | ========================================= Outputs & filters: ------------------------------------- 0 - output([T511.A], [T511.B], [T511.C], [T512.A], [T512.B], [T512.C]), filter(nil), conds(nil), nl_params_([T511.A]) 1 - output([T511.A], [T511.B], [T511.C]), filter(nil), access([T511.A], [T511.B], [T511.C]), partitions(p0) 2 - output([T512.A], [T512.B], [T512.C]), filter(nil), access([T512.A], [T512.B], [T512.C]), partitions(p0) 1 row in set使用
EXPLAIN EXTENDED命令展示执行计划。obclient> EXPLAIN EXTENDED SELECT * FROM t511,t512 WHERE t511.a = t512.a\G *************************** 1. row *************************** Query Plan: ========================================= |ID|OPERATOR |NAME|EST. ROWS|COST| ----------------------------------------- |0 |NESTED-LOOP JOIN| |1 |53 | |1 | TABLE SCAN |T511|1 |46 | |2 | TABLE GET |T512|1 |7 | ========================================= Outputs & filters: ------------------------------------- 0 - output([T511.A(0x7f03f423b040)], [T511.B(0x7f03f423b840)], [T511.C(0x7f03f423bb00)], [T512.A(0x7f03f423b300)], [T512.B(0x7f03f423bdc0)], [T512.C(0x7f03f423c080)]), filter(nil), conds(nil), nl_params_([T511.A(0x7f03f423b040)]), batch_join=false 1 - output([T511.A(0x7f03f423b040)], [T511.B(0x7f03f423b840)], [T511.C(0x7f03f423bb00)]), filter(nil), access([T511.A(0x7f03f423b040)], [T511.B(0x7f03f423b840)], [T511.C(0x7f03f423bb00)]), partitions(p0), is_index_back=false, range_key([T511.A(0x7f03f423b040)]), range(MIN ; MAX)always true 2 - output([T512.A(0x7f03f423b300)], [T512.B(0x7f03f423bdc0)], [T512.C(0x7f03f423c080)]), filter(nil), access([T512.A(0x7f03f423b300)], [T512.B(0x7f03f423bdc0)], [T512.C(0x7f03f423c080)]), partitions(p0), is_index_back=false, range_key([T512.A(0x7f03f423b300)]), range(MIN ; MAX), range_cond([? = T512.A(0x7f03f423b300)(0x7f03f429aee0)]) Used Hint: ------------------------------------- /*+ */ Outline Data: ------------------------------------- /*+ BEGIN_OUTLINE_DATA LEADING(@"SEL$1" ("SYS.T511"@"SEL$1" "SYS.T512"@"SEL$1")) USE_NL(@"SEL$1" "SYS.T512"@"SEL$1") FULL(@"SEL$1" "SYS.T511"@"SEL$1") FULL(@"SEL$1" "SYS.T512"@"SEL$1") END_OUTLINE_DATA */ Plan Type: ------------------------------------- LOCAL Optimization Info: ------------------------------------- T511:table_rows:1, physical_range_rows:1, logical_range_rows:1, index_back_rows:0, output_rows:1, est_method:default_stat, optimization_method=cost_based, avaiable_index_name[T511] T512:table_rows:1, physical_range_rows:1, logical_range_rows:1, index_back_rows:0, output_rows:1, est_method:default_stat, optimization_method=rule_based, heuristic_rule=unique_index_without_indexback Parameters ------------------------------------- 1 row in set使用
EXPLAIN EXTENDED_NOADDR命令展示执行计划。obclient> EXPLAIN EXTENDED_NOADDR SELECT * FROM t511,t512 WHERE t511.a = t512.a\G *************************** 1. row *************************** Query Plan: ========================================= |ID|OPERATOR |NAME|EST. ROWS|COST| ----------------------------------------- |0 |NESTED-LOOP JOIN| |1 |53 | |1 | TABLE SCAN |T511|1 |46 | |2 | TABLE GET |T512|1 |7 | ========================================= Outputs & filters: ------------------------------------- 0 - output([T511.A], [T511.B], [T511.C], [T512.A], [T512.B], [T512.C]), filter(nil), conds(nil), nl_params_([T511.A]), batch_join=false 1 - output([T511.A], [T511.B], [T511.C]), filter(nil), access([T511.A], [T511.B], [T511.C]), partitions(p0), is_index_back=false, range_key([T511.A]), range(MIN ; MAX)always true 2 - output([T512.A], [T512.B], [T512.C]), filter(nil), access([T512.A], [T512.B], [T512.C]), partitions(p0), is_index_back=false, range_key([T512.A]), range(MIN ; MAX), range_cond([? = T512.A]) 1 row in set使用
EXPLAIN OUTLINE命令可以显示 Outline 信息。obclient> EXPLAIN OUTLINE SELECT * FROM t511,t512 WHERE t511.a = t512.a\G *************************** 1. row *************************** Query Plan: ========================================= |ID|OPERATOR |NAME|EST. ROWS|COST| ----------------------------------------- |0 |NESTED-LOOP JOIN| |1 |53 | |1 | TABLE SCAN |T511|1 |46 | |2 | TABLE GET |T512|1 |7 | ========================================= Outputs & filters: ------------------------------------- 0 - output([T511.A], [T511.B], [T511.C], [T512.A], [T512.B], [T512.C]), filter(nil), conds(nil), nl_params_([T511.A]) 1 - output([T511.A], [T511.B], [T511.C]), filter(nil), access([T511.A], [T511.B], [T511.C]), partitions(p0) 2 - output([T512.A], [T512.B], [T512.C]), filter(nil), access([T512.A], [T512.B], [T512.C]), partitions(p0) Outline Data: ------------------------------------- /*+ BEGIN_OUTLINE_DATA LEADING(@"SEL$1" ("SYS.T511"@"SEL$1" "SYS.T512"@"SEL$1")) USE_NL(@"SEL$1" "SYS.T512"@"SEL$1") FULL(@"SEL$1" "SYS.T511"@"SEL$1") FULL(@"SEL$1" "SYS.T512"@"SEL$1") END_OUTLINE_DATA */ 1 row in set