ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 我的一次sql优化

我的一次sql优化

原创 Linux操作系统 作者:zsy0951 时间:2019-06-08 18:36:08 0 删除 编辑

客户总部日初中有个过程每次执行都要花2个半小时甚至更多,影响到业务正常进行,后来以至于影响门店发送数据到总部不完成,POS日初执行不完成(门店和POS是同一台机器)。

此时必须对sql进行优化了。

原语句:

Select JGLMARKET,JGLMFID,jglcatid,JGLSUPID,Sum(jglqmsl) QCSL,Sum(JGLQMHSJJJE) QCJE
From hq_jxcgoodslist
Where jgldate>=add_months(initdate,-6) and jgldate<=initdate-1 and
jglseq
In (select max(jglseq)
From hq_jxcgoodslist
Where jgldate>=add_months(initdate,-6) and jgldate<=initdate-1
group by JGLMARKET,JGLMFID,jglsupid,jglwmid,JGLMD,JGLSHELF,JGLSAMPLE,jglgdid)

第一次优化:

新建中间表rpt_tempjxc_seq1(jglsseq, jglsmarket),加parallel hint,dbms_stats.gather_table_stats。

1.生成中间表

FOR row_jgl1 IN (SELECT jglseq FROM
(SELECT *+ PARALLEL(hq_jxcgoodslist,4) *jglseq FROM hq_jxcgoodslist
WHERE jgldate >= date1 AND jgldate <= date2 AND
jglmarket = vmkt
GROUP BY jglseq, jglmarket, jglmfid, jglsupid, jglwmid, jglmd, jglshelf, jglsample, jglgdid
ORDER BY jglseq DESC)
WHERE rownum = 1) LOOP
INSERT INTO rpt_tempjxc_seq1 (jglsseq, jglsmarket)
VALUES (row_jgl1.jglseq, vr.mfcode);
END LOOP;

2.查询数据

Select JGLMARKET,JGLMFID,jglcatid,JGLSUPID,Sum(jglqmsl) QCSL,Sum(JGLQMHSJJJE) QCJE
From jxcgoodslist,rpt_tempjxc_SEQ1
Where jgldate >= date1 and jgldate <= date2 and
jglseq = jglsseq and jglmarket = jglsmarket
Group by JGLMARKET,JGLMFID,jglcatid,JGLSUPID)

半小时能搞定。高兴中...

跟踪了一些天,发现这个sql执行时间也越来越长,然后回到优化之前的状态:影响门店发送数据到总部不完成,POS日初执行不完成。

于是有了第二次优化。

充分利用索引,绑定变量。

OPEN cur_jxctemp FOR 'SELECT jglseq FROM
(SELECT /*+ PARALLEL(hq_jxcgoodslist,4) */jglseq FROM hq_jxcgoodslist
WHERE jgldate >= :1 AND jgldate <= :2 AND
jglmfid like :3 AND jglmarket = :4
GROUP BY jglseq, jglmarket, jglmfid, jglsupid, jglwmid, jglmd, jglshelf, jglsample, jglgdid
ORDER BY jglseq DESC)
WHERE rownum = 1' USING date1, date2, vlike, vmkt;
LOOP
FETCH cur_jxctemp INTO l_seq;
EXIT WHEN cur_jxctemp%NOTFOUND OR cur_jxctemp%NOTFOUND IS NULL;

INSERT INTO rpt_tempjxc_seq1 (jglsseq, jglsmarket)
VALUES (l_seq, vmkt);
END LOOP;
CLOSE cur_jxctemp;

最大变化就是jglmfid like :3,where语句中加了这一条

充分利用了IDX_JGL_DTMFID索引,where条件语句中不加此语句和加此语句,执行结果差异非常之大。

不加此语句执行要1000多秒,加此语句100多秒搞定。索引还是很管用,哪怕之前用parallel hint,新建中间表,采集统计信息,用绑定变量,效果都不如利用索引!

IDX_JGL_DTMFID索引语法为

create index IDX_JGL_DTMFID on HQ_JXCGOODSLIST (JGLDATE, JGLMFID)

继续跟踪...

跟踪了几天发现在执行时间慢慢变长,测试发现是因为m201门店goodsbatch每天日终发送数据影响到总部的日初执行(m201门店goodsbatch有近两百条记录),不是总部日初影响到门店发送数据。后来暂停m201门店的goodsbatch表发送,最近一段时间包括黄金周五一都没有出现总部日初慢或者门店发送数据慢的问题了。

此问题告一段落。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/14740/viewspace-467832/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2002-06-26

  • 博文量
    35
  • 访问量
    35259