达梦数据库SQL性能问题排查及绑定执行计划

在达梦数据库演示使用ET去排查慢SQL执行计划最耗时的步骤及怎么去绑定执行计划
select r.*

  from(select my_table.*,

               ROWNUM myrw

          from(select tablea.*,

                       ROWNUM rw

                  from(select ENAME, age,HIREDATE,sal

                          from emp where eid > 8000000

                         and DEPTNO > 1 ORDERby sal desc)

tablea ) my_table

         where rw < 5001

           and rw > 0)r ;

执行计划如下
开启ET,只对当前会话生效

ALTER SESSION SET 'MONITOR_SQL_EXEC'=1;

再次执行sql,点击执行号,et界面为空白

一般原因是结果集没有加载全部数据,
需要将返回结果集数据全部加载完成之后,再次点击执行号打开et,可以看到主要该sql主要耗时在全表扫描,其次是排序
进一步排查可以看到 eid > 8000000 和DEPTNO > 1返回结果集都很多,过滤条件都很差,就算建了索引也会走全表扫描
创建索引,尝试消除排序
createindex idx_emp_sal on emp(sal desc);
再次执行之后,执行时间7s多,主要耗时还是全表扫描和排序
而且执行计划也没有变化(这里为什么执行计划一样的情况下,执行时间差距很大)
通过添加hint,让执行计划走sal这个索引消除排序
可以看到指定索引之后,执行时间减少到8毫秒
如果无法立即直接修改sql语句,可通过sf_inject_hint 去绑定执行计划,用法如下
sf_inject_hint(

'',--要指定 HINT的 SQL语句或片段,不能修改原始sql位置,多了空格都会导致失效

'',--要为 SQL指定的 HINT

'',--规则指定名称 

null,--对规则的详细描述

true,--规则是否生效

true --值为 TRUE或 NULL时,模糊匹配;值为 FALSE或缺省时,精准匹配

);

----注-

1  使用 SF_DEINJECT_HINT 删除 SQL 的 HINT 规则。

2 通过 SYSINJECTHINT 视图查看 SQL 语句及其注入的 HINT 规则信息

示例:通过sf_inject_hint绑定执行计划走emp表中 idx_emp_sal索引
sf_inject_hint(

'select ENAME, age,HIREDATE,sal from emp where eid > 8000000

and DEPTNO > 1 ORDER by sal desc',

'index(emp idx_emp_sal)',

'inject_idx_esal',

null,true,true

);

绑定之后如下sql就不需要指定索引了
 
 
 
 
 
posted @ 2026-06-23 11:23  fangzpa  阅读(11)  评论(0)    收藏  举报