背景
执行计划的阅读是SQL优化的关键,最近咨询执行计划中ACTRL操作符问题较多,SQL优化介绍就从自适应计划开始唠起,对涉及的几个问题做下解答,本次主要介绍阅读执行计划中省略自适应计划部分,自适应原理和备计划使用阈值不做介绍。
基础知识(避免野路子,先按照官方手册抄作业)
ACTRL是什么意思?
ACTRL是达梦数据库的一个操作符,意思是使用自适应计划机制时,控制备用计划转换。
自适应机制的由来?
自适应机制是在 DM 优化器进行代价估算时,如果子节点是一个复杂查询,可能使得对于子节点的代价估算不准确,导致最终选择的计划在执行时并非最优计划。
自适应机制启用方法?
将 INI 参数 OPTIMIZER_MODE 和 ADAPTIVE_NPLN_FLAG 都置为 1
启用自适应机制的好处?
优化器会自动判断在某些情况下,复杂查询的子节点可能导致代价估算不准确,则会为该节点生成一个备用计划节点。在实际执行到该节点时,根据准确的代价信息确
定是否需要采用备用计划
使用范围
MPP 和并行查询不支持自适应计划
案例分析
OPTIMIZER_MODE
DROP TABLE T1;
DROP TABLE T2;
CREATE TABLE T1(C1 INT,C2 INT);
CREATE TABLE T2(D1 INT,D2 INT);
INSERT INTO T1 VALUES(1,1);
INSERT INTO T1 VALUES(1,2);
INSERT INTO T2 VALUES(1,1);
INSERT INTO T2 VALUES(2,1);
INSERT INTO T2 VALUES(3,1);
INSERT INTO T2 VALUES(4,1);
INSERT INTO T2 VALUES(5,1);
COMMIT;
CREATE INDEX IND1 ON T1(C2);
EXPLAIN SELECT * FROM T1 ,T2 ,T1 T3 WHERE T2.D1= T3.C1 AND T1.C2=T2.D2;
计划中ID-5就是自适应计划操作符ACTRL,ID-11是自适应计划带出来的
自适应计划怎么阅读呢
ACTRL 是控制备用计划转换的操作符,其上面一层 NEST LOOP INDEX JOIN2 为默认的主计划,再上面一层 HASH2 INNER JOIN 则为备用计划。ACTRL 操作符计算下层孩子节点的代价,决定采用默认主计划还是备用计划。
自适应计划关闭
通常在优化中使用hint: /+ ADAPTIVE_NPLN_FLAG(0)/临时取消,方便查看执行计划
开启自适应计划和未开启自适应计划对比
相关知识介绍
OPTIMIZER_MODE参数是否影响自适应计划
OPTIMIZER_MODE是新老优化器模式的选择,其中前序遍历算法和后续遍历算法可以简单介绍下
后序遍历和先序遍历是二叉树深度优先遍历,就是DFS的两种经典策略。它们的核心区别在于根节点被访问的时机。
直观演示
误区事项
是否可以直接关闭OPTIMIZER_MODE(0)
直接关闭是不可取的,涉及优化其模式问题,直接关闭影响面太大
文章
阅读量
获赞
