记录一次SQL 查询 LEFT JOIN 相关优化

ops/2024/11/9 16:44:44/

记录一次 LEFT JOIN 相关优化

  • 1 环境说明
  • 2 sql 在dm库查询用时30秒
    • 2.1 sql 语句
    • 2.2 sql 执行计划
  • 3 调优数据库参数
    • 3.1 使用hint 调整数据库参数
    • 3.2 hint 的执行计划
  • 4 永久修改数据库参数
  • 5 参数说明
  • 6 达梦数据库学习使用列表

1 环境说明

  • 某项目的公文办公系统在生产环境刚部署好 , 发现业务系统打开慢 , 使用DM性能监视器(monitor.exe) 找出相关慢sql
  • sql 涉及3张表 , 三张表数据量和oracle 一样 , 一样的sql 查询语句在oracle 执行 1秒以内完成 , 在DM库需要30s
  • 数据库版本
  • oracle 11g
  • dm8.1-3-100-2024.01.15-215128-20081-ENT
表名数据量
A_INFOS11458330
FW616757
c_remotesend10496798

sql_dm30_16">2 sql 在dm库查询用时30秒

sql__17">2.1 sql 语句

sql">select*
from(SELECT sum(CASE WHEN send.STATUS >= 0 THEN 1 ELSE 0 END) AS TOTAL    ,sum(CASE WHEN send.STATUS  = 1 THEN 1 ELSE 0 END) AS SIGNTOTAL,A_INFOS.BT                                                    ,A_INFOS.CWRQ                                                  ,A_INFOS.ID                                                    ,A_INFOS.MODULE_ID                                             ,A_INFOS.OBJCLASS                                              ,A_INFOS.WH                                                    ,A_INFOS.XFORM_ID                                              ,A_INFOS.MAJORUNIT                                             ,A_INFOS.NGRQ                                                  ,A_INFOS.DOCTYPEFROMA_INFOS A_INFOS --数据量11458330INNER JOIN FW FW		--数据量616757ONA_INFOS.ID = FW.INFO_IDLEFT JOIN c_remotesend send	--数据量10496798 (不带left join  查询用时 1秒, 带left join查询用时 30秒,最终结果集 2400 行数据量)ONA_INFOS.id = send.info_idWHEREA_INFOS.DOCTYPE LIKE '平行收文'AND A_INFOS.module_id = 1912587286812359AND A_INFOS.MAINUNIT  = 140683AND A_INFOS.ROWSTATE >= 0AND(('%%' = '%%')OR A_INFOS.BT LIKE '%%')AND(('%%' = '%%')OR A_INFOS.WH LIKE '%%')AND A_INFOS.CWRQ >= to_date('1900-01-01 00:00:00', 'yyyy-MM-dd HH24:mi:ss')AND A_INFOS.CWRQ <= to_date('2099-12-12 23:59:59', 'yyyy-MM-dd HH24:mi:ss')GROUP BYA_INFOS.BT       ,A_INFOS.CWRQ     ,A_INFOS.ID       ,A_INFOS.MODULE_ID,A_INFOS.OBJCLASS ,A_INFOS.WH       ,A_INFOS.XFORM_ID ,A_INFOS.MAJORUNIT,A_INFOS.NGRQ     ,A_INFOS.DOCTYPEORDER BYA_INFOS.CWRQ DESC)
whererownum <= 10

sql__86">2.2 sql 执行计划

在这里插入图片描述

3 调优数据库参数

3.1 使用hint 调整数据库参数

  • enable_hash_join
  • phc_mode_enforce
  • 查询数据库参数正在使用值
SELECT * FROM V$DM_INI WHERE PARA_NAME IN ('ENABLE_HASH_JOIN','PHC_MODE_ENFORCE');生效
ENABLE_HASH_JOIN    1	0	1	1	N	1	1	enable hash join	SESSION	ALL_SYNC	CAN_SYNC
PHC_MODE_ENFORCE	0	0	15	0	N	0	0	enforce the join mode	SESSION	ALL_SYNC	CAN_SYNC
  • 调整以下两个参数 sql查询时间 在3-4秒 , sql 未改动
sql">select /*+ enable_hash_join(0) *//*+ phc_mode_enforce(2) */*
from(SELECT sum(CASE WHEN send.STATUS >= 0 THEN 1 ELSE 0 END) AS TOTAL    ,sum(CASE WHEN send.STATUS  = 1 THEN 1 ELSE 0 END) AS SIGNTOTAL,A_INFOS.BT                                                    ,A_INFOS.CWRQ                                                  ,A_INFOS.ID                                                    ,A_INFOS.MODULE_ID                                             ,A_INFOS.OBJCLASS                                              ,A_INFOS.WH                                                    ,A_INFOS.XFORM_ID                                              ,A_INFOS.MAJORUNIT                                             ,A_INFOS.NGRQ                                                  ,A_INFOS.DOCTYPEFROMA_INFOS A_INFOS --数据量11458330INNER JOIN FW FW		--数据量616757ONA_INFOS.ID = FW.INFO_IDLEFT JOIN c_remotesend send	--数据量10496798 (不带left join  查询用时 1秒, 带left join查询用时 30秒,最终结果集 2400 行数据量)ONA_INFOS.id = send.info_idWHEREA_INFOS.DOCTYPE LIKE '平行收文'AND A_INFOS.module_id = 1912587286812359AND A_INFOS.MAINUNIT  = 140683AND A_INFOS.ROWSTATE >= 0AND(('%%' = '%%')OR A_INFOS.BT LIKE '%%')AND(('%%' = '%%')OR A_INFOS.WH LIKE '%%')AND A_INFOS.CWRQ >= to_date('1900-01-01 00:00:00', 'yyyy-MM-dd HH24:mi:ss')AND A_INFOS.CWRQ <= to_date('2099-12-12 23:59:59', 'yyyy-MM-dd HH24:mi:ss')GROUP BYA_INFOS.BT       ,A_INFOS.CWRQ     ,A_INFOS.ID       ,A_INFOS.MODULE_ID,A_INFOS.OBJCLASS ,A_INFOS.WH       ,A_INFOS.XFORM_ID ,A_INFOS.MAJORUNIT,A_INFOS.NGRQ     ,A_INFOS.DOCTYPEORDER BYA_INFOS.CWRQ DESC)
whererownum <= 10

3.2 hint 的执行计划

在这里插入图片描述

4 永久修改数据库参数

  • 动态会话级 , 同时修改内存值 与 dm.ini 文件 , 新的会话生效 , 不用重启数据库
sql">SP_SET_PARA_VALUE(1,'ENABLE_HASH_JOIN',0);
SP_SET_PARA_VALUE(1,'PHC_MODE_ENFORCE',2);
--(清除执行计划缓存)
CALL SP_CLEAR_PLAN_CACHE();

5 参数说明

参数名默认值类型说明
ENABLE_HASH_JOIN1动态,会话级是否允许使用哈希连接,0:不允许;1:允许。
PHC_MODE_ENFORCE0动态,会话级控制连接的实现方式。0:优化器根据代价情况自由选择连接方式;1:允许使用 NEST LOOP INNER JOIN;2:允许使用索引连接;4:允许使用哈希连接;8:允许使用归并连接支持使用上述有效值的组合值,如 6 表示优化器根据代价情况在索引连接和哈希连接间进行选择。当参数值不为 0 或 15 且包含 2/4/8 其中之一或者它们的组合值时,会将包含的值对应的连接模式参数置 为 1, 没 有包 含 的 值对 应的 连 接 模式 参 数 置为 0(2 对 应 ENABLE_INDEX_JOIN,4 对 应ENABLE_HASH_JOIN,8 对应 ENABLE_MERGE_JOIN)。例如,取值为 6 时没有包含 8,则会将ENABLE_INDEX_JOIN 和 ENABLE_HASH_JOIN 置为 1,将 ENABLE_MERGE_JOIN 置为 0(仅强制设置内存中的值,不改变 dm.ini 文件中的值)

6 达梦数据库学习使用列表

  • 达梦数据库学习使用列表 - - 点击跳转

http://www.ppmy.cn/ops/100205.html

相关文章

Programmatically add website content to OpenAI with C#

题意&#xff1a;使用 C# 以编程方式将网站内容添加到 OpenAI。 问题背景&#xff1a; Our goal is to have a ChatGPT answer questions about our websites content. 我们的目标是让 ChatGPT 回答关于我们网站内容的问题。 We are trying to integrate something similar t…

Qt使用usbcan通信

一.usbcan环境搭建 可以参照我的这篇博客&#xff1a;USBCAN-II/II使用方法以及qt操作介绍 二.项目效果展示 三.项目代码 这部分代码仅仅展示了部分功能&#xff0c;仅供参考。 #include"ControlCAN.h" #include<QDebug> #include <windows.h> #incl…

23种设计模式之工厂模式

文章目录 工厂模式工厂模式经典案例工厂模式分类与优缺点工厂模式的使用场景工厂模式的优点简单工厂模式实现工厂方法模式实现抽象工厂模式实现 工厂模式 工厂模式是一种创建对象的设计模式&#xff0c;将对象的创建和使用分离&#xff0c;可提高代码可维护性、可扩展性&#…

C++实现的爬楼梯问题

爬楼梯问题是什么 爬楼梯问题是一个经典的动态规划问题&#xff0c;通常被用于学习和理解递归与动态规划的基本概念。问题的描述是&#xff1a;假设有一个楼梯&#xff0c;总共有n级台阶&#xff0c;你每次可以爬1级或2级台阶&#xff0c;问有多少种不同的方式可以爬到楼顶。 …

C# Hashtable

目录 Hashtalbe的本质 申明 增 删 查 改 遍历 Hashtalbe的本质 Hashtable&#xff08;又称散列表&#xff09; 是基于键的哈希代码组织起来的 键/值对 它的主要作用是提高数据查询的效率 使用键来访问集合中的元素 申明 需要引用命名空间 System.Collectio…

Spring Cloud Stream与Kafka(一)

Spring Cloud Stream与Kafka&#xff08;一&#xff09; ​ 在实际开发过程中&#xff0c;消息中间件用于解决应用解耦&#xff0c;异步消息&#xff0c;流量削峰等问题&#xff0c;实现高可用、高性能、可伸缩和最终一致性架构。不同的消息中间件实现方式不同&#xff0c;内部…

【Go - 每日一小问: 对未初始化的的 chan 进行读写,会怎么样?为什么?】

对未初始化的 chan 进行读写会有不同的行为&#xff1a; 1. 对未初始化的 chan 进行读取 读取操作&#xff1a; 对未初始化的 chan 进行读取操作会导致永久阻塞&#xff08;deadlock&#xff09;&#xff0c;因为没有任何 goroutine 可以向这个 chan 发送数据。读取操作会一直…

【C++】01背包问题暴力,记忆,动态规划解法

0-1 背包问题详解与实现 目录 0-1 背包问题详解与实现问题描述问题分析状态定义状态转移方程边界条件算法实现暴力搜索记忆化搜索动态规划空间优化 总结思维导图C学习资源 问题描述 在算法领域&#xff0c;0-1背包问题是一个经典的优化问题。给定一个背包和一个物品集合&#…