当前位置: 首页 > news >正文

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

记录一次 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

2 sql 在dm库查询用时30秒

2.1 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

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 未改动
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 文件 , 新的会话生效 , 不用重启数据库
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.mrgr.cn/news/4739.html

相关文章:

  • 合宙LuatOS生成毫秒级时间戳
  • XSS中DOM型注入技巧
  • Linux入门——08 进程间通讯——管道
  • Total Commander 右键卡死问题,百度云冲突
  • 数学基础 -- 线性代数之排列及其逆序数
  • 云计算实训34——docker环境配置、镜像基本操作、容器基本操作、设置远程连接管理
  • 企业为什么需要安装加密软件
  • 亚马逊测评号生存法则:如何抵御亚马逊封号风波?
  • LeetCode面试题Day12|LC209 长度最小的子数组、LC30 串联所有单词的子串
  • 【cocos creator】2.x里,使用3D射线碰撞检测
  • JS SyntaxError: Unexpected token 报错解决
  • ant design pro 技巧之实现列表页多标签
  • Apache CloudStack Official Document 翻译节选(三)
  • 梦与不存在的幻境
  • 数据库原理--关系1
  • 【原创】java+swing+mysql房屋租赁管理系统设计与实现
  • Java基础核心知识学习笔记
  • 跟着GPT学习 Kubernetes ,简称 K8s(二)
  • 【MySQL】mysql异常宕机无法启动处理过程
  • Autosar_MCAL_Adc