前言:
遇到问题不要怕,先看一看。
语句看懂了,创建个索引,优化个处理方式,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
问题:
语句执行需要30S,导致前端查询特别慢。
解读:
查询
字段。。。。。。。
子查询1大概是待办数量
子查询2大概是待办状态
子查询3取了啥最大值
子查询4取了啥最小值
子查询5fk反馈日期
子查询6xc反馈日期
查询督办任务。
测试:
子查询语句单独执行测试,都挺快的。
主查询测试,也很快。
整体分析测试,F9查看(未看出所以然,略过)
排除法测试1-去掉子查询1,速度提升30→15
排除法测试2-去掉子查询2,速度提升15→0.16
初步定位问题,验证问题点,去掉所有子查询,速度提升到0.014
锁定定位问题,验证问题点,加回子查询2,速度14S
锁定分析问题,去掉其他查询字段,减少影响因素
再次F9查看执行分析
mt.dbrw=govern_task.id 这一步代价大,分析可能原因1:dbrw是自定义字段,不是索引字段。 2.子查询重复执行。
优化思路二:增加索引
创建索引
表:formtable_main_279 字段:dbrw
语法:create index 索引名 on 表名(sourceid,rightid);
命名:idx_表名_联合索引名字
创建:CREATE INDEX
IDX_formtable_main_279_dbrw ON
formtable_main_279(dbrw)
执行测试,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 的流程数量。
优化语句:
流程表单增加状态字段,做节点前后的赋值,去掉大表拼接。
select
count (mt.requestid) from
formtable_main_279 mt where mt.lczt=1 and mt.dbrw=govern_task.id
历史数据赋值更新:
先查询后更新
再验证
测试验证:无条件时与优化前结果一致。
测试验证:0.36秒提升为0.08秒,速度提升4倍。
原语句测试:0.8S提升为0.3S,速度提升2.5倍。
优化后数据结果与原语句查询结果导出对比测试一致。
总结:
经过排查定位、创建索引、优化语句。
Select 查询语句由 30.19秒 提升为0.33秒,速度提升了90倍
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.e1idc.net