---
title: "查看查询执行计划 | OceanBase 文档中心"
description: 查看查询执行计划 OceanBase 的 SQL 引擎支持执行计划解析和缓存技术，可以通过分析查询语句的执行计划来分析查询性能。 执行计划是对一条 SQL 查询语句在数据库中执行过程的描述，通常用于分析某条 SQL 的性能问题，读懂执行计划是 SQL 优化的先决条件。用户可以通过 EXPLAIN 命令查看优化器针对指…
image: https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*OSPzQ6GUQF4AAAAAQHAAAAgAeiGDAQ/original
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 3.2.3 企业版 LTS

# 查看查询执行计划

更新时间：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` 命令所展示的信息可以帮助普通用户了解整个计划的执行方式。

### 语法

```sql
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 区域中单击 ![按钮](https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/doc/img/observer-enterprise/V3.2.3/zh-CN/3.deploy-the-oceanbase-database/image023.png)，查看执行计划信息。

- 使用 `EXPLAIN BASIC` 命令展示执行计划。

  ![EXPLAIN BASIC](https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/doc/img/observer-enterprise/V3.2.3/zh-CN/3.deploy-the-oceanbase-database/image024.jpg)
 - 使用 `EXPLAIN` 命令展示执行计划。

  ![EXPLAIN EXTENDED](https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/doc/img/observer-enterprise/V3.2.3/zh-CN/3.deploy-the-oceanbase-database/image025.jpg)
 - 使用 `EXPLAIN EXTENDED` 命令展示执行计划。

  ![EXPLAIN EXTENDED_NOADDR](https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/doc/img/observer-enterprise/V3.2.3/zh-CN/3.deploy-the-oceanbase-database/image026.jpg)
 - 使用 `EXPLAIN EXTENDED_NOADDR` 命令展示执行计划。

  ![1](https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/doc/img/observer-enterprise/V3.2.3/zh-CN/3.deploy-the-oceanbase-database/image027.png)
 - 使用 `EXPLAIN OUTLINE` 命令可以显示 Outline 信息。

  ![EXPLAIN EXTENDED_NOADDR](https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/doc/img/observer-enterprise/V3.2.3/zh-CN/3.deploy-the-oceanbase-database/image028.jpg)

## 使用黑屏环境查看执行计划示例

- 使用 `EXPLAIN BASIC` 命令展示执行计划。

  ```sql
  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` 命令展示执行计划。

  ```sql
  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   |
  =========================================

  ```
 - 使用 `EXPLAIN EXTENDED` 命令展示执行计划。

  ```sql
  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
  -------------------------------------

  ```
 - 使用 `EXPLAIN EXTENDED_NOADDR` 命令展示执行计划。

  ```sql
  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])

  ```
 - 使用 `EXPLAIN OUTLINE` 命令可以显示 Outline 信息。

  ```sql
  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   |
  =========================================

  ```

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
