达梦查询执行计划,索引速度相关操作符解释
1. 扫描操作符 (Scan Operators)
这类操作符决定了数据库如何从表或索引中读取数据。
CSCN2: 集群序列扫描 (Cluster Sequence Scan)
-
含义:这是最常见的全表扫描操作符。它会扫描指定表的所有行和所有列(除非使用了投影下推优化)。
CSCN2中的 “2” 通常代表操作符的版本或内部标识。 -
何时出现:
-
表没有合适的索引。
-
查询条件无法使用任何索引(例如对索引列使用了函数
WHERE UPPER(name) = 'ABC')。 -
需要读取的数据量超过表总数据量的很大一部分(例如 >20%),优化器认为全表扫描比索引扫描成本更低。
-
-
性能影响:通常被认为是性能杀手,尤其是对于大表。它需要大量I/O和CPU资源。如果您在执行计划中看到
CSCN2,应该首先考虑是否能通过添加索引、优化查询条件来避免它。
SSEK2 / SSEK3: 二级索引范围扫描 (Secondary Index Range Scan)
-
含义:通过非唯一索引(二级索引)进行查找或范围扫描。
SSEK2通常用于等值查询,SSEK3用于范围查询,但有时也混用。 -
何时出现:查询条件匹配了表的某个二级索引。
-
特点:
-
先访问索引结构,找到符合条件的 rowid(行ID)。
-
再根据 rowid 回表(
BLKUP2)去主表(聚簇索引)中取出该行的完整数据。 -
如果索引已经覆盖了所有查询所需的列(覆盖索引),则不需要回表,性能极佳。
-
CSEK2: 聚簇索引扫描 (Cluster Index Scan)
-
含义:沿着聚簇索引(在达梦中通常是主键索引)进行范围扫描。
-
何时出现:查询条件包含了聚簇索引键的范围查询(如
WHERE primary_key > 100)。 -
特点:因为表数据本身就是按聚簇索引顺序存储的,所以
CSEK2效率很高,非常适合范围查询。
BLKUP2: 回表操作 (Back Table Lookup)
-
含义:它不是独立的扫描操作,而是
SSEK2/CSEK2的一个伴随操作。当使用索引扫描但索引未能覆盖所有所需列时,就需要通过 rowid 回到主表中去获取完整的数据行。 -
性能影响:如果回表的次数非常多(例如查询返回几万行),大量的随机I/O会成为性能瓶颈。优化方法是创建覆盖索引(让索引包含查询中的所有列)。
2. 连接操作符 (Join Operators)
这类操作符决定了两张表如何连接。
NEST LOOP INNER JOIN (嵌套循环连接)
-
工作原理:
-
从驱动表(外表)取一行。
-
根据连接条件,去被驱动表(内表)中查找匹配的行(通常会走索引)。
-
循环往复,直到驱动表的所有行都处理完。
-
-
适用场景:驱动表结果集很小,并且内表有高效索引时,速度非常快。是OLTP系统的首选连接方式。
HASH INNER JOIN (哈希连接)
-
工作原理:
-
选择一张表作为构建表,在内存中为其构建一个哈希表。
-
然后逐行扫描另一张表(探测表),对连接列计算哈希值,去哈希表中查找匹配的行。
-
-
适用场景:适用于处理大量数据且没有索引的连接,常见于数据仓库和OLAP场景。它需要消耗较多的内存。
MERGE INNER JOIN (排序合并连接)
-
工作原理:
-
先将两个表都按照连接列进行排序。
-
然后同时遍历两个已排序的结果集,合并匹配的行。
-
-
适用场景:当连接列上已经有索引(结果集已有序)时,效率很高。或者当结果需要有序输出时。
3. 其他重要操作符
SORT: 排序
-
用于
ORDER BY、GROUP BY(非索引)、DISTINCT等操作。 -
是非常消耗CPU和内存的操作,如果数据量大可能需要借助磁盘临时空间。
HASH GROUP BY: 哈希分组
-
使用哈希算法实现
GROUP BY操作,通常比SORT GROUP BY效率更高。
PRJT2: 投影 (Projection)
-
负责选择需要输出的列。几乎每个执行计划中都有它。
SLCT2: 选择 (Selection)
-
负责执行
WHERE子句中的过滤条件。
如何获取和分析执行计划
在达梦中,最常用的方法是使用 EXPLAIN 命令:
-- 最简单的方式
EXPLAIN SELECT * FROM your_table WHERE your_condition;
-- 更详细的方式(推荐)
EXPLAIN FOR SELECT * FROM your_table WHERE your_condition;
对于图形化界面(如DM管理工具),你可以直接点击“执行计划”按钮来获取可视化的解释。
进阶工具:ET (Elapsed Time)EXPLAIN 只显示计划,不执行。要查看每个操作符的实际执行时间,可以使用ET功能(需要先开启):
-- 开启ET
CALL ET(1);
-- 执行你的SQL
SELECT * FROM your_table WHERE your_condition;
-- 查看ET报告,它会显示每个操作符的耗时、返回行数等详细信息
ET报告是性能调优的利器,能精准定位耗时最长的操作符。
总结与调优思路
-
警惕全扫:看到
CSCN2,首先思考能否通过添加索引来消除它。 -
避免回表:看到
SSEK2 + BLKUP2,如果频繁回表,考虑创建覆盖索引。 -
选择连接:理解不同连接算法的适用场景。小表驱动大表用
NEST LOOP,大数据集用HASH JOIN。 -
关注耗时:使用
ET工具,量化每个步骤的代价,抓住主要矛盾进行优化。
希望这份详细的解释能帮助您更好地理解和优化达梦数据库的SQL性能!

浙公网安备 33010602011771号