首页 > 数据库 >记一次达梦数据库虚拟表SQL优化记录分享

记一次达梦数据库虚拟表SQL优化记录分享

时间:2023-04-07 17:37:31浏览次数:42  
标签:数据库 SQL 查询 mt 达梦 govern dbrw id select

前言:

遇到问题不要怕,先看一看。

语句看懂了,创建个索引,优化个处理方式,30S变0.3秒,速度提升90倍。

 

背景:

达梦数据库、督办定制功能的一个查询列表慢(虚拟表)。

语句:

select id as dbrw,hzrwnr,createdate,BB,whbh01,whbh02,whbh03,zkh,ykh,sfyrq,qtkckry,

(

select count (wfrb.requestid)

from workflow_requestbase wfrb

left join formtable_main_279 mt

on wfrb.requestid=mt.requestid

where mt.dbrw=govern_task.id

and currentnodeid=1831

) as dshsl,

case (

select count (wfrb.requestid)

from workflow_requestbase wfrb

left join formtable_main_279 mt

on wfrb.requestid=mt.requestid

where mt.dbrw=govern_task.id

and currentnodeid=1831

) when 0 then 0 else 1 end as dshzt,

jsjbh,id,name,remark,sponsordept,responsible,coordinatordept,sponsor,coordinator,dycfksx,status,cjrbm,HZfgld,HZlxrq,HZwcsx,HZbz,HZxgfj,jgfkpl,CATEGORYID,

(select max(ldzt) from uf_dbfk where taskid=govern_task.id) as ldzt,

(select min(issign) from govern_operator where taskid=govern_task.id) as sfyqs,

status as zt1,(select fkksrq from (select UD.taskid,max(UDT1.fkksrq) as fkksrq from uf_dbfk UD,uf_dbfk_dt1 UDT1 where  UD.id = UDT1.mainid group by UD.taskid) where taskid=govern_task.id) as fkksrq

,(select xcfkrq from (select UD.taskid,max(UDT1.jhldrqhuang) as xcfkrq from uf_dbfk UD,uf_dbfk_dt1 UDT1 where  UD.id = UDT1.mainid group by UD.taskid) where taskid=govern_task.id) as xcfkrq,aenddate,aendtime

from govern_task

where tasktype=0 and status !=4

 

问题:

记一次达梦数据库虚拟表SQL优化记录分享_字段

语句执行需要30S,导致前端查询特别慢。

解读:

查询

  字段。。。。。。。

  子查询1大概是待办数量

  子查询2大概是待办状态

  子查询3取了啥最大值

  子查询4取了啥最小值

  子查询5fk反馈日期

  子查询6xc反馈日期

查询督办任务。

 

测试:

子查询语句单独执行测试,都挺快的。

 

记一次达梦数据库虚拟表SQL优化记录分享_优化_02

 

主查询测试,也很快。

记一次达梦数据库虚拟表SQL优化记录分享_优化_03

整体分析测试,F9查看(未看出所以然,略过)

记一次达梦数据库虚拟表SQL优化记录分享_优化_04

排除法测试1-去掉子查询1,速度提升30→15

记一次达梦数据库虚拟表SQL优化记录分享_子查询_05

排除法测试2-去掉子查询2,速度提升15→0.16

记一次达梦数据库虚拟表SQL优化记录分享_字段_06

初步定位问题,验证问题点,去掉所有子查询,速度提升到0.014

记一次达梦数据库虚拟表SQL优化记录分享_原语_07

锁定定位问题,验证问题点,加回子查询2,速度14S

记一次达梦数据库虚拟表SQL优化记录分享_优化_08

锁定分析问题,去掉其他查询字段,减少影响因素

记一次达梦数据库虚拟表SQL优化记录分享_字段_09

再次F9查看执行分析

mt.dbrw=govern_task.id 这一步代价大,分析可能原因1:dbrw是自定义字段,不是索引字段。 2.子查询重复执行。

 

记一次达梦数据库虚拟表SQL优化记录分享_原语_10

 

优化思路二:增加索引

创建索引

表:formtable_main_279  字段:dbrw

语法:create index 索引名 on 表名(sourceid,rightid);

命名:idx_表名_联合索引名字

创建:CREATE INDEX IDX_formtable_main_279_dbrw ON  formtable_main_279(dbrw)

记一次达梦数据库虚拟表SQL优化记录分享_子查询_11

执行测试,14S提升为0.3S,速度提升40倍

原语句测试,30S提升为0.8S,速度提升35倍

 

优化思路一:尝试优化语句

解读语句:

 

select count (wfrb.requestid) from workflow_requestbase wfrb left join formtable_main_279 mt

on wfrb.requestid=mt.requestid where currentnodeid=1831 and  mt.dbrw=govern_task.id

 

查找流程表单:formtable_main_279,对应任务ID,当前节点为1831 的流程数量。

 

优化语句:

记一次达梦数据库虚拟表SQL优化记录分享_字段_12

流程表单增加状态字段,做节点前后的赋值,去掉大表拼接。

select count (mt.requestid) from  formtable_main_279 mt where mt.lczt=1 and  mt.dbrw=govern_task.id

 

历史数据赋值更新:

记一次达梦数据库虚拟表SQL优化记录分享_原语_13

先查询后更新

记一次达梦数据库虚拟表SQL优化记录分享_原语_14

再验证

 

记一次达梦数据库虚拟表SQL优化记录分享_原语_15

测试验证:无条件时与优化前结果一致。

记一次达梦数据库虚拟表SQL优化记录分享_原语_16

测试验证:0.36秒提升为0.08秒,速度提升4倍。

记一次达梦数据库虚拟表SQL优化记录分享_原语_17

原语句测试:0.8S提升为0.3S,速度提升2.5倍。

记一次达梦数据库虚拟表SQL优化记录分享_优化_18

优化后数据结果与原语句查询结果导出对比测试一致。

 

 

总结:

经过排查定位、创建索引、优化语句。

Select 查询语句由 30.19秒 提升为0.33秒,速度提升了90倍

 

 

 

 

标签:数据库,SQL,查询,mt,达梦,govern,dbrw,id,select
From: https://blog.51cto.com/mflag/6171451

相关文章

  • sql 逐行累加
    sql逐行累加,包括当前行selectname,sl,sum(sl)over(partitionbynameorderbynamerowsbetweenunboundedprecedingandcurrentrow)asaccumulatefromtest;    可以实现在窗口中进行逐行累加selectuid,month,amount,sum(amount)over(partitionbyuid......
  • docker-compose运行mysql 8.0.2
    docker-compose.yamlversion:'3.9'services:core:depends_on:mysql:condition:service_healthymysql:image:mysql:8.0.32container_name:mysql:8.0.32restart:alwayscommand:--default-authentication-plu......
  • javascript把本地sql数据库表转换为对象
    在做项目的时候,需要读取本地数据库,并且在页面上显示出来,原始数据读取出来的原始数据如下:varr=sqliteDB.exec(document.getElementById('txtSQL').value); console.info(r);  使用系统的转换方式console.log('Hereisarow:'+JSON.stringify(r));  可以看到其......
  • C# SQL JEXCEL 增删改查
    Handler1.ashx(用一般程序连接数据库)1<%@WebHandlerLanguage="C#"Class="Handler1"%>23usingSystem;4usingSystem.Web;5usingSystem.Data;6usingSystem.Data.SqlClient;//数据库7usingNewtonsoft.Json;//操作json库89......
  • MySQL笔记之一致性视图与MVCC实现
    一致性读视图是InnoDB在实现MVCC用到的虚拟结构,用于读提交(RC)和可重复度(RR)隔离级别的实现。一致性视图没有物理结构,主要是在事务执行期间用来定义该事物可以看到什么数据。  一、ReadView事务在正式启动的时候我们会创建一致性视图,该一致性视图是基于整个库的。 1、tran......
  • 非关系数据库型--Redis
    RedisRedis安装1.yum/apt安装root@ubuntu:~#aptinforedisPackage:redisVersion:5:6.0.16-1ubuntu1Priority:optionalSection:universe/databaseOrigin:Ubuntu[root@localhost~]#yuminforedisAvailablePackagesName:redisVersion:5.0.3......
  • 动力节点王鹤SpringBoot3笔记——第四章 访问数据库
    视频:动力节点SpringBoot3从入门到项目实战第四章访问数据库SpringBoot框架为SQL数据库提供了广泛的支持,既有用JdbcTemplate直接访问JDBC,同时支持“objectrelationalmapping”技术(如Hibernate,MyBatis)。SpringData独立的项目提供对多种关系型和非关系型数据库的访问支持。......
  • 踩坑/docker桌面版安装mysql
     很久没安装了,忘记如何启动了。删掉了本地images,然后重新拉取镜像。5.7.5-m15是最新的,但是本地启动失败。后来换成8.0.32版本的就可以了。这里需要说下中间出的问题:因为国内拉取docker官网镜像有问题,换成国内的进行:https://dashboard.daocloud.io/;dockerpulldaocloud.io/l......
  • SQL子句学习(2)
    (一)AND,OR,NOT运算符实例1运算优先级:NOT>AND>OR,可以使用括号改变,一般都加括号便于理解这些运算符用于多条件筛选,跟数学中的逻辑运算一样练习1答案1点击查看答案代码SELECT*FROMorder_itemsWHEREorder_id=6ANDunit_price*quantity>30--除了SELECT后可以进行......
  • mysql+navicat安装配置教程
    一、MySQLl和Navicat的关系Mysql一个关系型数据库管理系统,由瑞典MysqlLAB公司开发,目前属于Oracle旗下产品,是目前最流行的关心型数据库管理系统之一。Navicat一个数据库管理工具,用可视化界面提供给用户操作Mysql数据库管理系统。记得我第一次安装Navicat之后,就以为......