一则sql优化记录

数据库巡检的时候,发现一条高耗sql。


执行计划如下:


其中逻辑读和物理读分别为


从执行计划中可以看出,cost高主要是由于PO_ARRIVEORDER_B和PO_ORDER_BB1的全表扫描引起。

查看过滤条件可知,同时查询得知PO_ARRIVEORDER_B表上的pk_order_bb1选择性很好。可尝试在pk_order_bb1上建立索引。

建立索引

create index test1  on PO_ARRIVEORDER_B(PK_ORDER_BB1);

查看执行计划


同时发现

PO_ORDER_BB1表的过滤条件为

16 -filter(SUBSTR("A1"."DSENDDATE",1,10)>='2018-05-01' AND

           SUBSTR("A1"."DSENDDATE",1,10)<='2018-06-06' AND"A1"."DR"=0)

此处有函数转换,建议将语句修改下,并在PO_ORDER_BB1下建立索引

Create index test on PO_ORDER_BB1 (DSENDDATE);

SELECT t_1.cgzz  CGZZ,

      t_1.gys   GYS,

      t_1.txm   TXM,

      substr(t_1.fhrq, 1, 10) FHRQ,

      t_1.dhrq  DHRQ,

      t_1.ck    CK,

      t_1.cgdd  CGDD,

      t_1.sapdj SAPDJ,

      t_1.hh    HH,

      t_1.cgy   CGY,

      t_1.wlbm  WLBM,

      t_1.wlmc  WLMC,

      t_1.dw    DW,

      t_1.fhsl  FHSL,

      t_1.dhsl  DHSL,

      t_1.pc    PC

 FROM (SELECT a1.vbatchcode pc,

               a1.dsenddate fhrq,

               a1.pk_group jt,

               a7.name cgzz,

               a8.name gys,

               a1.vbdef2 txm,

               a6.vdef14 sapdj,

               a2.crowno hh,

               substr(a1.dplanarrvdate, 1, 10)dhrq,

               a9.code cgy,

               a4.code ck,

               a6.vbillcode cgdd,

               a5.code dw,

               a1.nastnum fhsl,

               a10.arriveqty dhsl,

               a3.code wlbm,

               a3.name wlmc

         FROM po_order_bb1 a1

         LEFT outer JOIN po_order_b a2

           ON a1.pk_order_b = a2.pk_order_b

         LEFT outer JOIN bd_material a3

           ON a1.pk_srcmaterial = a3.pk_material

         LEFT outer JOIN bd_stordoc a4

           ON a1.pk_recvstordoc = a4.pk_stordoc

         LEFT outer JOIN bd_measdoc a5

           ON a1.castunitid = a5.pk_measdoc

         LEFT outer JOIN po_order a6

           ON a1.pk_order = a6.pk_order

         LEFT outer JOIN org_orgs a7

           ON a1.pk_org = a7.pk_org

         LEFT outer JOIN bd_supplier a8

           ON a6.pk_supplier = a8.pk_supplier

         LEFT outer JOIN bd_psndoc a9

           ON a6.cemployeeid = a9.pk_psndoc

         LEFT outer JOIN (SELECT pk_order_bb1 pk_order_bb1,

                                 sum(nnum)arriveqty

                            FROMpo_arriveorder_b

                           WHERE dr = 0

                           GROUP BYpk_order_bb1) a10

           ON a1.pk_order_bb1 = a10.pk_order_bb1

        WHERE a1.dr = 0) t_1

 WHERE (t_1.cgzz = 'xxxxxxxx')

  AND (t_1.fhrq BETWEEN '2018-05-01 00:00:00' AND '2018-06-06 23:59:59')

 ORDER BY t_1.cgzz, t_1.gys, t_1.txm, t_1.wlbm;


逻辑读下降到1w多




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值