達夢包含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
英文地址,請注明出處:http://en.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…