在执行 EXPLAIN 命令时,系统会为给定的 SQL 生成最终的逻辑执行计划并展示给用户,但并不会生成相应的物理执行计划(可执行的代码),也不会真正执行该计划或者将该计划放入计划缓存。

SQL 执行计划的展示是了解 SQL 执行逻辑和性能调优的最重要的手段。

EXPLAIN 命令包括 BASIC、EXTENDED 和 PARTITIONS 等,内容的详细程度有所区别。

命令格式如下:

EXPLAIN 输出的第一部分是执行计划的树形结构展示。其中每一个操作在树中的层次通过其在 OPERATOR 中的缩进予以展示。如下例所示的执行计划:

其对应的树状执行计划如下图所示:

执行计划中的各项的含义如下:

在表操作中,NAME 字段会显示该操作涉及的表的名称(别名),如果是使用索引访问,还会在名称后的括号中展示该索引的名称, 例如 表示使用了 t1_c2 这个索引。另外,如果扫描的顺序是逆序,还会在后面使用 Reserve 关键字标识,例如 t1(t1_c2,Reverse)

一些常见的算子类型归纳如下表:

EXPLAIN 输出的第二部分是各操作算子的详细信息,包括输出表达式、过滤条件、分区信息以及各算子的独有信息,包括排序键、连接键、下压条件等。

重点的信息如下:

  • filters

    OceanBase 数据库的所有算子都有执行过滤条件的能力,filters 列出了该算子需要执行的过滤操作,对于表访问操作,我们会将所有过滤条件(包括回表前后的过滤条件)都下压到存储层。

  • access

    表访问操作中需要调用存储层的接口访问具体的数据,access 展示了存储层的对外输出(投影)列名。

  • partitions

  • range_key 和 range

    OceanBase 数据库中的物理表理论上都是索引组织表(包括二级索引本身),扫描的时候都会按照一定的顺序进行扫描,这个顺序就是该表的主键,体现在 range_key 中,当用户给定不同条件时,优化器会定位到最终扫描的范围,通过 range 展示,如下例所示的计划:

可以看出要访问的表为 t1_c2 这张索引表,表的主键为 (c2, c1),扫描的范围是全表扫描。

一些常用的算子信息含义如下表: