达梦查询执行计划,索引速度相关操作符解释

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 用于范围查询,但有时也混用。

  • 何时出现:查询条件匹配了表的某个二级索引。

  • 特点:

    1. 先访问索引结构,找到符合条件的 rowid(行ID)。

    2. 再根据 rowid 回表(BLKUP2)去主表(聚簇索引)中取出该行的完整数据。

    3. 如果索引已经覆盖了所有查询所需的列(覆盖索引),则不需要回表,性能极佳。

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 (嵌套循环连接)

  • 工作原理:

    1. 从驱动表(外表)取一行。

    2. 根据连接条件,去被驱动表(内表)中查找匹配的行(通常会走索引)。

    3. 循环往复,直到驱动表的所有行都处理完。

  • 适用场景:驱动表结果集很小,并且内表有高效索引时,速度非常快。是OLTP系统的首选连接方式。

HASH INNER JOIN (哈希连接)

  • 工作原理:

    1. 选择一张表作为构建表,在内存中为其构建一个哈希表。

    2. 然后逐行扫描另一张表(探测表),对连接列计算哈希值,去哈希表中查找匹配的行。

  • 适用场景:适用于处理大量数据且没有索引的连接,常见于数据仓库和OLAP场景。它需要消耗较多的内存。

MERGE INNER JOIN (排序合并连接)

  • 工作原理:

    1. 先将两个表都按照连接列进行排序。

    2. 然后同时遍历两个已排序的结果集,合并匹配的行。

  • 适用场景:当连接列上已经有索引(结果集已有序)时,效率很高。或者当结果需要有序输出时。


3. 其他重要操作符

SORT: 排序

  • 用于 ORDER BYGROUP BY(非索引)、DISTINCT 等操作。

  • 是非常消耗CPU和内存的操作,如果数据量大可能需要借助磁盘临时空间。

HASH GROUP BY: 哈希分组

  • 使用哈希算法实现 GROUP BY 操作,通常比 SORT GROUP BY 效率更高。

PRJT2: 投影 (Projection)

  • 负责选择需要输出的列。几乎每个执行计划中都有它。

SLCT2: 选择 (Selection)

  • 负责执行 WHERE 子句中的过滤条件。


如何获取和分析执行计划

在达梦中,最常用的方法是使用 EXPLAIN 命令:

sql
 
-- 最简单的方式
EXPLAIN SELECT * FROM your_table WHERE your_condition;

-- 更详细的方式(推荐)
EXPLAIN FOR SELECT * FROM your_table WHERE your_condition;

对于图形化界面(如DM管理工具),你可以直接点击“执行计划”按钮来获取可视化的解释。

进阶工具:ET (Elapsed Time)
EXPLAIN 只显示计划,不执行。要查看每个操作符的实际执行时间,可以使用ET功能(需要先开启):

sql
 
-- 开启ET
CALL ET(1);

-- 执行你的SQL
SELECT * FROM your_table WHERE your_condition;

-- 查看ET报告,它会显示每个操作符的耗时、返回行数等详细信息

ET报告是性能调优的利器,能精准定位耗时最长的操作符。

总结与调优思路

  1. 警惕全扫:看到 CSCN2,首先思考能否通过添加索引来消除它。

  2. 避免回表:看到 SSEK2 + BLKUP2,如果频繁回表,考虑创建覆盖索引。

  3. 选择连接:理解不同连接算法的适用场景。小表驱动大表用 NEST LOOP,大数据集用 HASH JOIN

  4. 关注耗时:使用 ET 工具,量化每个步骤的代价,抓住主要矛盾进行优化。

希望这份详细的解释能帮助您更好地理解和优化达梦数据库的SQL性能!

posted @ 2025-08-26 10:34  不知名路人!  阅读(88)  评论(0)    收藏  举报