达梦包含OR条件的SQL特定优化----INJECT-HINT优化方法

Time:2025/08/07
Author:skatexg

应用迭代发版须执行如下动作
1按目标需求全面压力测试,优化潜在慢SQL或设置特殊优化参数(如:OPTIMIZER_OR_NBEXP)
2达梦数据库有数据导入,必须收集统计信息

达梦使用SF_INJECT_HINT系统函数对指定SQL增加HINT,保证SQL在不同环境的执行计划相同,稳定执行效率。适合在SQL执行计划较差或者走错(比如走了索引但回表代价高于全表扫描、表连接错误等情况)且业务调整SQL语句代价比较大需要立即优化见效的情况下使用。

一、SF_INJECT_HINT功能说明

SF_INJECT_HINT使用介绍

SF_INJECT_HINT系统函数的功能是对指定SQL增加HINT。可通过SYSINJECTHINT视图查看已指定的SQL语句和对应的HINT;

SQL> select * from sys.SYSINJECTHINT;

使用方法如下

SF_INJECT_HINT(SQL_TEXT,HINT_TEXT,NAME,DESCRIPTION,VALIDATA,FUZZY);

参数说明如下:

SQL_TEXT:要指定HINT的SQL语句或者片段;

HINT_TEXT:要为SQL指定的HINT;多个hint使用空格隔开;语法:参数名称(参数值)

NAME:配置这条规则的名称,通过这个名字,可以通过 sp_deinject_hint('名字'),进行规则取消

DESCRIPTION:对规则的详细描述,可为NULL;

VALIDATA:规则是否生效,可为NULL,则为默认值TRUE;

FUZZY:SQL的匹配规则为精准匹配或模糊匹配。值为TRUE或NULL时,模糊匹配;值为FALSE或缺省时,精准匹配;

说明:FUZZY参数在老的版本中是不支持的(DM V8 1-1-190附近的版本才开始支持)

使用时的限制条件如下

(1)INI参数ENABLE_INJECT_HINT需设置为1;

(2)SQL只能是语法正确的增删改查语句;

(3)SQL会经过系统格式化,格式化之后的SQL和指定的规则名称必须全局唯一;

(4)HINT一指定,则全局生效;

(5)系统检查SQL匹配时,必须是整条语句完全匹配,不能是语句中子查询匹配;

使用场景:

通过SF_INJECT_HINT函数为SQL指定HINT的方式,适合在SQL执行计划较差或者走错(比如走了索引但回表代价高于全表扫描、表连接错误等情况)且业务调整SQL语句代价比较大的情况下使用。

说明:

INJECT_HINT使用示例

(1)设置INI参数ENABLE_INJECT_HINT为1

ENABLE_INJECT_HINT参数表示是否启用SQL指定HINT的功能,0:不启用;1:启用,默认0。动态,会话级参数,修改后无需重启数据库生效。

SQL> SP_SET_PARA_VALUE(1,'ENABLE_INJECT_HINT',1);

(2)会话级开启MONITOR_SQL_EXEC,方便使用ET查看SQL执行计划各个操作消耗的时间

sf_set_session_para_value('MONITOR_SQL_EXEC',1);

(3)首先查看测试SQL执行时间以及SQL执行计划各个操作的耗时

执行sql:select * from tab1 where v1 like 'sdf%' or v2 like 'sdf%' limit 10

使用et(sql执行号)查看执行计划中各个步骤的耗时情况

SQL> et(2748105249)

通过上面3步可发现执行计划慢在哪一步,对于遇到sql包含OR条件,通过OPTIMIZER_OR_NBEXP可以优化OR表达式。在不变动参数的全局影响时,可以通过HINT方式,对个别SQL进行调整(这种HINT可以注入在后台,不需要修改应用代码,可以随时取消)

参数名字:OPTIMIZER_OR_NBEXP

默认值:0

属性:动态会话级

0:不优化;

1:生成 UNION_FOR_OR 操作符时,优化为无 KEY 比较方式;

2:OR 表达式优先考虑整体处理方式;

4:相关子查询的 OR 表达也优考虑整体处理方式;

8:OR 布尔表达式的范围合并优化;

16:同一列上同时存在常量范围过滤和 IS NULL 过滤时的优化,如 C1 > 5 OR C1 IS NULL。

支持使用上述有效值的组合值,如 7 表示同时进行 1、2、4 的优化

在个别SQL中,我们可能调整为2,效果更好。

二、样例测试说明

达梦版本:DM8.1.4.6

--1、构造数据

create table tab1(v1 varchar(30000),v2 varchar(30000),v3 varchar(30000));

create index idx_tab1_v1 on tab1(v1);

--2、待分析SQL

select * from tab1 where v1 like 'sdf%' or v2 like 'sdf%' limit 10

执行计划如下

1 #NSET2: [1, 2, 156]

2 #PRJT2: [1, 2, 156]; exp_num(4), is_atom(FALSE)

3 #TOPN2: [1, 2, 156]; top_num(10)

4 #UNION FOR OR2: [1, 2, 156]; key_num(0), outer_join(-)

5 #BLKUP2: [1, 1, 156]; idx_tab1_v1(tab1)

6 #SSEK2: [1, 1, 156]; scan_type(ASC), idx_tab1_v1(tab1), scan_range['sdf','sdg'), is_global(0)

7 #SLCT2: [1, 1, 156]; (tab1.v2 >= 'sdf' AND tab1.v2 < 'sdg' AND exp11)

8 #CSCN2: [1, 1, 156]; INDEX33609591(tab1); btr_scan(1)

从如上执行计划来看,这个sql的or条件被拆分了两个sql,然后union结果集;

在保持全局参数为0的情况下,希望使用 OPTIMIZER_OR_NBEXP 为 2的效果,如何为这个语句修改参数?

手工对sql执行效率

select /*+OPTIMIZER_OR_NBEXP(2)*/ * from tab1 where v1 like 'sdf%' or v2 like 'sdf%' limit 10

1 #NSET2: [1, 1, 156]

2 #PRJT2: [1, 1, 156]; exp_num(4), is_atom(FALSE)

3 #TOPN2: [1, 1, 156]; top_num(10)

4 #SLCT2: [1, 1, 156]; ((tab1.v1 >= 'sdf' AND tab1.v1 < 'sdg') OR (tab1.v2 >= 'sdf' AND tab1.v2 < 'sdg'))

5 #CSCN2: [1, 1, 156]; INDEX33609591(tab1); btr_scan(1)

select /*+OPTIMIZER_OR_NBEXP(0)*/ * from tab1 where v1 like 'sdf%' or v2 like 'sdf%' limit 10

1 #NSET2: [1, 2, 156]

2 #PRJT2: [1, 2, 156]; exp_num(4), is_atom(FALSE)

3 #TOPN2: [1, 2, 156]; top_num(10)

4 #UNION FOR OR2: [1, 2, 156]; key_num(1), outer_join(-)

5 #BLKUP2: [1, 1, 156]; idx_tab1_v1(tab1)

6 #SSEK2: [1, 1, 156]; scan_type(ASC), idx_tab1_v1(tab1), scan_range['sdf','sdg'), is_global(0)

7 #SLCT2: [1, 1, 156]; (tab1.v2 >= 'sdf' AND tab1.v2 < 'sdg') SLCT_PUSHDOWN(TRUE)

8 #CSCN2: [1, 1, 156]; INDEX33609591(tab1) NEED_SLCT(TRUE); btr_scan(1)

--3、为特定SQLSQL语句修改参数 OPTIMIZER_OR_NBEXP 为 2

sf_inject_hint(

'* from tab1 where v1 like ''sdf%'' or v2 like ''sdf%'' limit',--sql语句或者片段

'OPTIMIZER_OR_NBEXP(2)',--参数调整说明,语法:参数名称(参数值)

'inject_20250806',--这条调整规则的名字,通过这个名字,我们可以通过 sp_deinject_hint('名字'),进行规则取消

null,true,true

);

--4、查看计划:确实修改成功了,or根据 OPTIMIZER_OR_NBEXP 为 2 的规则,作为一个整体处理了

1 #NSET2: [1, 1, 156]

2 #PRJT2: [1, 1, 156]; exp_num(4), is_atom(FALSE)

3 #TOPN2: [1, 1, 156]; top_num(10)

4 #SLCT2: [1, 1, 156]; ((tab1.v1 >= 'sdf' AND tab1.v1 < 'sdg') OR (tab1.v2 >= 'sdf' AND tab1.v2 < 'sdg'))

5 #CSCN2: [1, 1, 156]; INDEX33609591(tab1); btr_scan(1)

或查看系统视图

SQL>select * from sys.SYSINJECTHINT;

- -5、规则取消

sf_deinject_hint('inject_20250806'); -- 进行规则取消

三、会影响SQL性能常用参数

除了上面说的参数(OPTIMIZER_OR_NBEXP)可以通过HINT优化外,还有如下两个常用的参数会影响SQL性能

1、参数名字:COMPLEX_VIEW_MERGING

默认值:0

属性:动态会话级

对于复杂视图(一般含有GROUP或者集函数等)会执行合并操作,

使得 GROUP 分组操作在连接之后才执行。

0:不启用;

1: 对不包含别名和同名列的视图进行合并;

2: 视图定义包含别名或同名列时也进行合并

在个别SQL中,我们可能调整为2,效果更好。

2、参数名字:FILTER_PUSH_DOWN

默认值:0

属性:动态会话级

对单表条件是否下放的不同处理方式。

0: 表示条件不下放;

1: 表示在新优化器下, 对单表过滤条件进行下放处理;

2:表示在新优化器下对外连接、半连接进行下放条件优化处理;

4: 语义分析阶段考虑单表过滤条件的选择率, 超过0.5 则不下放,由后面进行代价计算选择是否下放, 参数值 4 仅在参数取值包含 2 时有效,即将参数值设为 6 时有效;

8: 表示尝试将包含非相关子查询的布尔表达式进行下放。

支持使用上述有效值的组合值, 如 6 表示同时进行 2 和 4 的优化

在个别SQL中,我们可能调整为1,效果更好。

----end----

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/94659.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/94659.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JSqlParser学习笔记 快速使用JSqlParser

文章目录前言本章节源码官方文档信息认识JSqlParserHow it works? 它是如何工作的&#xff1f;知识点关于statement实际应用场景引入依赖Parser 解析SQL解析sql语句解析sql区分sql类型分析增删改查语句查询语句认识PlainSelect示范新增语句了解Insert常用方法示范更新语句删除…

Godot ------ 中级人物血条制作01

Godot ------ 中级人物血条制作 引言 正文 传统血条制作 方格血条制作 传奇,暗黑破环神类血条显示 引言 在此之前,我们分四篇介绍了 Godot 中人物血条的制作,但是我们用到的都是比较基础的节点 ProgressBar,本文我们将介绍另外一种相对高级的节点 TextureProgressBar。 正…

《WebPages 类:构建高效网页的基石》

《WebPages 类&#xff1a;构建高效网页的基石》 引言 在互联网高速发展的今天&#xff0c;网页作为信息传递和交互的重要载体&#xff0c;其重要性不言而喻。而一个高效、美观、易用的网页&#xff0c;往往离不开一个优秀的网页类的设计。本文将深入探讨WebPages类的概念、特点…

直播预告|鸿蒙生态下的 Flutter 开发实战

《开发者 面对面》坚果派特辑直播&#xff08;二&#xff09;来了&#xff01;在鸿蒙系统日益完善的今天&#xff0c;Flutter 开发者将迎来哪些新机遇&#xff1f;在 HarmonyOS 上开发 Flutter&#xff0c;如何实现高效适配与生态融合&#xff1f;本期「开发者面对面」坚果派特…

web前端结合Microsoft Office Online 在线预览,vue实现(PPT、Word、Excel、PDF等)

web前端结合Microsoft Office Online 在线预览&#xff0c;vue实现&#xff08;PPT、Word、Excel、PDF等&#xff09; 什么是 Microsoft Office Online 预览服务 Microsoft Office Online 预览服务是由微软提供的免费在线文档预览工具&#xff0c;通过简单的 URL 参数配置&am…

安卓手机用久了会出现卡顿,为什么?

安卓手机用久了出现卡顿&#xff0c;主要与内存不足、系统机制特性、硬件老化、软件冲突与冗余、使用习惯不当五大核心因素相关。以下是具体原因及针对性解决方案&#xff1a;一、卡顿核心原因分析内存不足运行内存&#xff08;RAM&#xff09;被占用&#xff1a;安卓应用默认在…

以 Eland 玩转 Elasticsearch 8.12 Learning-to-Rank

1 为什么要在 Elasticsearch 上做 LTR&#xff1f; 适用版本&#xff1a; Elasticsearch ≥ 8.12.0 前置条件&#xff1a; 需拥有包含 “Serverless LTR” 的订阅等级&#xff08;详见官方订阅矩阵&#xff09; 技术栈&#xff1a; Elasticsearch Python Eland XGBoost / Li…

OpenCV入门:图像处理基础教程

OpenCV简介 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习库。它包含超过2500种优化算法&#xff0c;涵盖图像处理、物体识别、人脸检测、3D重建、视频分析等任务。 核心功能 图像处理&#xff1a;滤波、边缘检测、几…

影响内容传播速度的因素有哪些?

内容的传播速度是我们在衡量营销效果时的重要指标。传播速度越快&#xff0c;越能帮助品牌迅速覆盖目标受众&#xff0c;在短时间内提升影响力。影响内容传播速度的方式来自多个方面&#xff0c;下面就让我们一同来了解下这其中的因素。一、观点价值观点是否具有价值&#xff0…

css动态样式

使用scss通过变量设置css动态样式<template><div><!-- 方式一 --><p v-for"(item, index) in dataList" :key"index" :style"{--color: item.color}" >{{item.name}}</p><!-- 方式二 --><p v-for"(…

开源流媒体服务器ZLMediaKit 的Java Api实现的Java版ZLMediaKit流媒体服务器-二开视频对话

安全性&#xff1a;使用了WSS&#xff08;WebSocket Secure&#xff09;协议确保通信安全 兼容性&#xff1a;支持现代浏览器的WebRTC功能 信令机制&#xff1a;通过WebSocket进行信令交换&#xff0c;确保连接建立 媒体传输&#xff1a;使用STUN服务器进行NAT穿透&#xff0c;…

mariadb10.3.35备份脚本

一、创建备份用户[(none)]> create user buserlocalhost identified by tmrQ;[(none)]> GRANT RELOAD, PROCESS, LOCK TABLES, REPLICATION CLIENT ON *.* TO buserlocalhost;[(none)]> flush privileges;二、脚本# cat mysql_bask.sh #!/bin/bash # MariaDB 10.3.35…

W3D引擎游戏开发----从入门到精通【22】

配置完成基本DT物体项后&#xff0c;在这个DT物体项中开始添加这个玩家的动画信息&#xff0c;如下所示。UseAnim设置是否使用动画功能&#xff0c;这里开启。AnimTypeN设置总共的动画类型数&#xff0c;当前只有一个待机动画&#xff0c;因此设置为1。AnimType1FrameN设置1号动…

在我国申请注册的商标在国外可以用不!

近日一个网友找到普推知产商标老杨&#xff0c;问在我国申请注册商标在新加坡和欧盟可以用不&#xff0c;当然用不成&#xff0c;根据商标法的地域性原则&#xff0c;商标权保护限于注册地&#xff0c;驰名商标享有部分跨国保护&#xff0c;但是这个要有所在国相关法律证据。如…

在开发板上画出一个2048棋盘的矩阵

#include “head.h"int* p lcd NULL; //显示屏内存映射的起始地址int g lcd width; //LCD显示屏的宽度int g lcd high ; //LCD显示屏的高度int g lcd bpp; //每个像素点所占的比特位//int x:屏的X轴&#xff08;宽度、列&#xff09;坐标//int y:屏幕y轴&#xff08;高度、…

开源软件与文化:从嬉皮士精神到数字时代的协同创新

开源软件与文化&#xff1a;从嬉皮士精神到数字时代的协同创新 本文章由笔者使用提示词驱动AI创作&#xff0c;并进行审阅。 文章目录开源软件与文化&#xff1a;从嬉皮士精神到数字时代的协同创新一、引言&#xff1a;开源的文化基因与技术革命二、开源软件的文化根源&#x…

sigfillset 函数详解

sigfillset 函数详解 一、函数概念 sigfillset() 是 POSIX 信号处理中的核心函数&#xff0c;用于初始化并填充一个信号集&#xff0c;使其包含当前系统支持的所有信号。它是操作信号屏蔽字&#xff08;signal mask&#xff09;的基础工具&#xff0c;常与 sigprocmask()、sigs…

Redis实战(8) -- 分布式锁Redission底层机制

介绍Redisson 是基于 Redis 实现的 Java 驻内存数据网格&#xff08;In-Memory Data Grid&#xff09;&#xff0c;提供了分布式和可扩展的 Java 数据结构&#xff0c;如分布式锁、分布式集合等。【注意】如果需要重新实现redission&#xff0c;需要重新设置RedissionClient配置…

Linux基础测试

linux基础测试 一、环境准备 基础环境信息 登录用户&#xff1a;root&#xff08;初始密码&#xff1a;redhat&#xff09; 虚拟机启动&#xff1a;登录后执行 virt-manager&#xff0c;右键启动 node1 和 node2 虚拟机 node1 信息&#xff1a;root 密码为 redhat&#xf…

Linux中Docker Swarm实践

一、部署前后分离使用你自己的自定义镜像部署多个副本所有副本使用相同的配置和逻辑Nginx 做反向代理统一入口外部访问形式如&#xff1a;http://your-domain/api/xxx1.1 建立私库镜像已构建并推送到可访问的镜像仓库启动 Docker Registry 容器docker run -d -p 5000:5000 --re…