在工作中,SQL优化后往往缺乏改动条件,或改动意愿较低。那么,在不修改原SQL的前提下,是否仍能进行优化?答案无疑是肯定的。今天,我将分享一种在达梦数据库中使用hint的优化方法。该方法基于前一案例DM SQL关联列 like 优化案例,尚未阅读的朋友建议先进行了解。
HINT说明
• 需先开启ENABLE_INJECT_HINT参数
sp_set_para_value(1,'ENABLE_INJECT_HINT ',1);
• SQL只能是语法正确的增删改查语句 • SQL会经过系统格式化,格式化之后的SQL和指定的规则名称必须全局唯一 • HINT一指定,则全局生效; • 系统检查SQL匹配时,必须是整条语句完全匹配,不能是语句中子查询匹配 • 可通过 SYSINJECTHINT视图查看已指定的SQL语句和对应的HINT • 对指定SQL增加HINT
SF_INJECT_HINT('sql语句', '参数名(参数值)', '规则名', null,TRUE,TRUE);
```SQL
**对指定 SQL 撤回已增加的 HINT**
```SQL
SF_DEINJECT_HINT('规则名');
• 修改已指定 HINT 的规则属性
SF_ALTER_HINT('('规则名', 'STATUS', 'DISABLED');
使用hint注入优化
在不改动原SQL时候ENABLE_RQ_TO_NONREF_SPL(3)参数优化
关于参数说明如下:
相关查询表达式转化为非相关查询表达式,目的在于相关查询表达式的执行处理由之前的平坦化方式转化为一行处理。
0:不启用该优化;
1:对查询项中出现的相关子查询表达式进行优化处理;
2:对查询项和 WHERE 表达式中出现的相关子查询表达式进行优化处理;
4:相关查询采用 SPL 方式去相关性后,可以作为单表过滤条件
支持使用上述有效值的组合值,如 3 表示同时进行 1 和 2 的优化
使用用法
select /*+ ENABLE_RQ_TO_NONREF_SPL(3) */ a.col1 as d_id,
a.col2 as s_id,
a.col3 as bm,
a.col4,
a.col5,
(select b.col1 from table2 b where b.col_itname ='zb1'and b.col1 = a.col20) as bb,
a.col6 as dzzlxr,
a.col7 as dzzlxdh,
(select b.col1 from table2 b where b.col_itname ='zb2'and b.col1 = a.col21) as bc,
(select b.col1 from table2 b where b.col_itname ='zb3'and b.col1 = a.col22) as cb,
a.col8,
date_format(a.col9, '%Y-%m-%d %H:%i:%s') as gx,
a.col10 as cid,
a.col11 as tp,
(select b.col5 from table1 b where b.col1 = a.col2) as sj,
(selectcount(*) from table3 dy leftjoin table1 dzz on dy.col1 = dzz.col1 where dzz.col11 like concat(a.col11,'%')) as rc
from table1 a
where1=1
and a.col1 in ( /* 这里 in 了 600 个 字符串条件 */ );
100条执行成功, 执行耗时1分 28秒 248毫秒. 执行号:1432757809
HINT注入方式
对指定SQL增加HINT注入
SF_INJECT_HINT('select a.col1 as d_id,
a.col2 as s_id,
a.col3 as bm,
a.col4,
a.col5,
(select b.col1 from table2 b', 'ENABLE_RQ_TO_NONREF_SPL(3)', '慢SQLdzz_jbxx and dy_jbxx', null,TRUE,TRUE);
可通过视图查询
select * from SYSINJECTHINT;
优化后执行计划
执行SQL查询100条耗时278毫秒,hint优化后执行计划如下:
1 #NSET2: [8, 12347, 692]
2 #PIPE2: [8, 12347, 692]
3 #PIPE2: [8, 12347, 692]
4 #PIPE2: [8, 12347, 692]
5 #PIPE2: [8, 12347, 692]
6 #PIPE2: [8, 12347, 692]
7 #PRJT2: [4, 12347, 692]; exp_num(17), is_atom(FALSE)
8 #NEST LOOP INDEX JOIN2: [4, 12347, 692]
9 #CONST VALUE LIST: [1, 600, 48]; row_num(600), col_num(1),
10 #BLKUP2: [3, 1, 0]; INDEX33571964(A)
11 #SSEK2: [3, 1, 0]; scan_type(ASC), INDEX33571964(table1 as A), scan_range[DMTEMPVIEW_22267327.colname,DMTEMPVIEW_22267327.colname]
12 #SPL2: [4, 1, 144]; key_num(1), spool_num(4), is_atom(TRUE), has_variable(1)
13 #PRJT2: [4, 1, 144]; exp_num(1), is_atom(TRUE)
14 #AAGR2: [4, 1, 144]; grp_num(0), sfun_num(1) slave_empty(0)
15 #NEST LOOP INDEX JOIN2: [4, 1234, 144]
16 #SLCT2: [1, 617, 96]; DZZ.col11 LIKE var8
17 #CSCN2: [1, 12347, 96]; INDEX33571530(table1 as DZZ)
18 #SSEK2: [2, 2, 0]; scan_type(ASC), IDX_table3_col1(table3 as DY), scan_range[DZZ.col1,DZZ.col1]
19 #SPL2: [1, 1, 96]; key_num(1), spool_num(3), is_atom(TRUE), has_variable(1)
20 #PRJT2: [1, 1, 96]; exp_num(1), is_atom(TRUE)
21 #BLKUP2: [1, 1, 96]; INDEX33571964(B)
22 #SSEK2: [1, 1, 96]; scan_type(ASC), INDEX33571964(table1 as B), scan_range[var6,var6]
23 #SPL2: [1, 1, 96]; key_num(1), spool_num(2), is_atom(TRUE), has_variable(1)
24 #PRJT2: [1, 1, 96]; exp_num(1), is_atom(TRUE)
25 #SSEK2: [1, 1, 96]; scan_type(ASC), INDEX33572004(table2 as B), scan_range[('zb3',var5),('zb3',var5)]
26 #SPL2: [1, 1, 96]; key_num(1), spool_num(1), is_atom(TRUE), has_variable(1)
27 #PRJT2: [1, 1, 96]; exp_num(1), is_atom(TRUE)
28 #SSEK2: [1, 1, 96]; scan_type(ASC), INDEX33572004(table2 as B), scan_range[('zb2',var4),('zb2',var4)]
29 #SPL2: [1, 1, 96]; key_num(1), spool_num(0), is_atom(TRUE), has_variable(1)
30 #PRJT2: [1, 1, 96]; exp_num(1), is_atom(TRUE)
31 #SSEK2: [1, 1, 96]; scan_type(ASC), INDEX33572004(table2 as B), scan_range[('zb1',var3),('zb1',var3)]
需要注意的是,当遭遇SQL执行计划不佳的情况时,首先应审视统计信息是否存在问题,而非直接添加Hint。若统计信息准确无误,则需进一步评估物理结构的合理性,例如是否具备适当的索引。
只有在完成这些步骤后,若SQL依然无法按照优化的执行计划运行,才应考虑使用Hint,且不要过于依赖。
往期分享
安装部署
1.分享一个以前搭建主备集群遇到的一个路径乱码案例
2.给大家分享如何标准化部署达梦单机环境
3.DM达梦数据库中大写敏感介绍分享
数据迁移
1.分享工作中数据迁移的实用技巧与方法
2.Oracle迁移DM数据库实践
3.SQLark迁移实践分享(oracle-达梦数据库)
SQL调优
1.DM 传统行业SQL优化案例分享
2.DM数据库SQL优化案例分享
3.如何查询DM 数据库缓存执行计划与清理
4.使用ob_tools包收集分析oceanbase数据库oracle租户缓慢sql语句
5.使用format_obproxy_digest_log工具分析obproxy网络层耗时SQL
6.DM数据库回表优化案例
7.SQL优化案例分享
8.DM SQL关联列 like 优化案例
工具使用与日常处理
1.DataGrip访问国产数据库_datagrip 连接国产数据库
2.如何使用dbeaver连接达梦数据库
3.更新大字段提示-2201无效的对象问题
4.DM7读写分离部署问题总结
5.DM7读写分离集群备库数据不同步问题处理
6.达梦数据库DISQL工具部署及使用技巧
7.达梦数据库日常巡检方法分享
8.如何查询达梦数据库缓存执行计划与清理
9.达梦数据库运维工具分享
10.东方通中间件环境中如何部署达梦企业管理工具(DEM)




