任务描述

1 .问题分析

     select count() 查询,将不必要的查询字段,函数计算,和left join 去掉


     测试去掉后查询从180秒 到优化后的 1秒查询出结果


2.解决方案 参考(请分析业务逻辑,目前的原查询sql有有大量的函数统计,不必要的查询字段,left join 查询,建议去掉)


优化后的sql 如下:

SELECT Count(0)
FROM   (SELECT Abs(Isnull(wk.OutPutNum, 0) - Abs(Isnull(pu.OperateNum, 0))) AS DifferenceNum
        FROM   (SELECT put.CustomerID,
                       put.WareHouseID,
                       put.OutPutNum,
                       put.SKU
                FROM   RB_WareHouse_Product_OutPut_Log put WITH(NOLOCK)
                WHERE  put.CustomerID = 1
                       AND put.OutTime >= '2022-03-28'
                       AND put.OutTime < Dateadd(DAY, 1, '2022-04-28')
                       AND put.WareHouseID IN ( 1100000, 2, 279, 333,
                                                336, 687, 1185, 2205,
                                                3216, 3584, 3922, 4316,
                                                5312, 7056, 7057, 7085,
                                                7556, 7590 )
                GROUP  BY put.CustomerID,
                          put.WareHouseID,
                          put.OutPutNum,
                          put.SKU) wk
               FULL JOIN (SELECT inv.CustomerID,
                                 inv.WareHouseID,
                                 inv.OriginBillNumber,
                                 inv.OperateNum,
                                 inv.SKU
                          FROM   RB_Inventory_DetailLog inv WITH(NOLOCK)
                          WHERE  inv.BillType = 5
                                 AND inv.CustomerID = 1
                                 AND inv.OperateTime >= '2022-03-28'
                                 AND inv.OperateTime < Dateadd(DAY, 1, '2022-04-28')
                                 AND inv.WareHouseID IN ( 1100000, 2, 279, 333,
                                                          336, 687, 1185, 2205,
                                                          3216, 3584, 3922, 4316,
                                                          5312, 7056, 7057, 7085,
                                                          7556, 7590 )
                          GROUP  BY inv.CustomerID,
                                    inv.WareHouseID,
                                    inv.OperateNum,
                                    inv.SKU,
                                    inv.OriginBillNumber) pu
                      ON wk.WareHouseID = pu.WareHouseID
                         AND wk.SKU = pu.SKU) tep
WHERE  tep.DifferenceNum >= 1
       AND tep.DifferenceNum <= 9999999 



3. 原sql  http://pm.zhcxkj.com/zentao/bug-view-29163.html,已给解决方案,参考优化


SELECT COUNT(1) FROM (

select
tep.WareHouseID
--,rbwh.WareHouseName
--,tep.SKU                          
--,tep.PackageID
--,tep.OutPutNum
--,tep.OriginBillNumber
--,tep.OperateNum  as SumOperateNum
--,tep.InWareHouseID
--,inwh.WareHouseName as InWareHouseName
--,tep.DifferenceNum
--,ilog.OperateNum
--,ilog.BillNumber
--,ilog.OperateTime   
from
(
select
ISNULL(wk.CustomerID,pu.CustomerID) CustomerID,  
ISNULL(wk.WareHouseID,pu.WareHouseID) WareHouseID,
pu.InWareHouseID,
ISNULL(wk.SKU,pu.SKU) SKU,
ISNULL(wk.PackageID,PU.PackageID) PackageID,
ISNULL(wk.OutPutNum,0) OutPutNum,
ISNULL(wk.AllocationNumber,pu.OriginBillNumber) OriginBillNumber,   
ABS(ISNULL(pu.OperateNum,0)) OperateNum,
ABS(ISNULL(wk.OutPutNum,0)-ABS(ISNULL(pu.OperateNum,0))) as DifferenceNum
from
( select
put.CustomerID
,put.WareHouseID
,put.SKU
,ordl.PackageID
,bl.AllocationNumber
,SUM(put.OutPutNum) OutPutNum
from
RB_WareHouse_Product_OutPut_Log put with(NOLOCK)
left join RB_Procurement_Order_Package_OrderDetail ordl with(NOLOCK)
on put.CustomerID=ordl.CustomerID  and put.OrderListID=ordl.OrderListID
left join RB_Inventory_AllocationDetailBill bill with(NOLOCK) on bill.CustomerID=ordl.CustomerID and bill.SKU=ordl.SKU and bill.OrderListID=ordl.OrderListID
left join RB_Inventory_AllocationBill bl with(NOLOCK) on bill.AllocationBillID=bl.ID
left join RB_OrderInfo ordi with(NOLOCK)
on put.CustomerID=ordi.CustomerID and put.WareHouseID=ordi.WareHouseID and put.OrderCode=ordi.OrderCode
where  ordi.IsStockOrder=1  and bl.Status<>3 and bl.Status<>4
and put.CustomerID=1
and put.OutTime>='2022-03-28'  and put.OutTime< DATEADD(DAY,1,'2022-04-28')  and put.WareHouseID in (1100000,2,279,333,336,687,1185,2205,3216,3584,3922,4316,5312,7056,7057,7085,7556,7590)   group by put.CustomerID,put.WareHouseID,put.SKU,ordl.PackageID,bl.AllocationNumber
) wk full join
( select  
inv.CustomerID,
inv.WareHouseID,
bill.InWareHouseID,
inv.SKU,
pagd.PackageID,
inv.OriginBillNumber,
SUM(inv.OperateNum) OperateNum
from  
RB_Inventory_DetailLog inv with(NOLOCK)
left join RB_Procurement_Order_Package_OrderDetail pagd with(NOLOCK) on inv.CustomerID=pagd.CustomerID and inv.OrderListID=pagd.OrderListID
left join RB_Inventory_AllocationBill bill with(NOLOCK) on inv.CustomerID=bill.CustomerID and inv.OriginBillNumber=bill.AllocationNumber and inv.WareHouseID=bill.OutWareHouseID
where inv.BillType=5   and inv.CustomerID=1      and inv.OperateTime>='2022-03-28'  and inv.OperateTime< DATEADD(DAY,1,'2022-04-28')  and inv.WareHouseID in  (1100000,2,279,333,336,687,1185,2205,3216,3584,3922,4316,5312,7056,7057,7085,7556,7590)   group by inv.CustomerID,inv.WareHouseID,bill.InWareHouseID,inv.SKU,pagd.PackageID,inv.OriginBillNumber
) pu on wk.WareHouseID=pu.WareHouseID and wk.SKU=pu.SKU and wk.PackageID=pu.PackageID and wk.AllocationNumber=pu.OriginBillNumber   
) tep  
left join (select * from  RB_Inventory_DetailLog with(NOLOCK) where BillType=5   and OperateTime>='2022-03-28'  and  OperateTime< DATEADD(DAY,1,'2022-04-28') ) ilog
on ilog.CustomerID=tep.CustomerID and ilog.WareHouseID=tep.WareHouseID and ilog.SKU=tep.SKU and ilog.OriginBillNumber=tep.OriginBillNumber
left join RB_WareHouse rbwh with(NOLOCK) on tep.WareHouseID=rbwh.ID
left join RB_WareHouse inwh with(NOLOCK) on tep.InWareHouseID=inwh.ID
where  rbwh.WareHouseType=1   and  tep.DifferenceNum>=1 and tep.DifferenceNum<=9999999 ) AS PagerTable

--PARAMS:@CustomerID = 1 ,@StratTime = 2022-03-28 ,@EndTime = 2022-04-28 ,@StratNum = 1 ,@EndNum = 9999999

历史记录  
  1. 2022-05-03 16:44:55, 由 陈少军 创建。
  2. 2022-05-03 16:45:35, 由 陈少军 指派给 许瑞丰。
    修改了 预计剩余,旧值为 "0",新值为 "2"。
    已给解决方案,分析现有sql逻辑业务,参考优化
  3. 2022-05-07 11:11:00, 由 许瑞丰 指派给 张明磊。
    修改了 指派给,旧值为 "xuruifeng",新值为 "zhangminglei"。
  4. 2022-05-07 16:31:22, 由 张明磊 启动。
    修改了 实际开始,旧值为 "0000-00-00 00:00:00",新值为 "2022-05-07 16:29:41"。
    修改了 总计消耗,旧值为 "0",新值为 "2"。
    修改了 任务状态,旧值为 "wait",新值为 "doing"。

    调整已提交,线上观察

  5. 2022-05-07 16:33:00, 由 张明磊 完成。
    修改了 总计消耗,旧值为 "2",新值为 "2.1"。
    修改了 实际完成,旧值为 "",新值为 "2022-05-07 16:32:38"。
    修改了 任务状态,旧值为 "doing",新值为 "done"。
    修改了 预计剩余,旧值为 "2",新值为 "0"。
    修改了 由谁完成,旧值为 "",新值为 "zhangminglei"。
  6. 2022-05-07 16:34:11, 由 张明磊 关闭。
    修改了 任务状态,旧值为 "done",新值为 "closed"。
    修改了 指派给 ,旧值为 "zhangminglei",新值为 "closed"。
    修改了 由谁关闭,旧值为 "",新值为 "zhangminglei"。
    修改了 关闭时间,旧值为 "0000-00-00 00:00:00",新值为 "2022-05-07 16:34:11"。
    修改了 关闭原因,旧值为 "",新值为 "done"。
所属迭代 系统管理部 - 系统服务优化
所属模块 /
相关需求 暂无
指派给 Closed 于 2022-05-07 16:34:11
任务类型 后端
任务标签 初始
开发组
任务状态 已关闭
进度 100%
优先级 P2
关键词
抄送给 刘灿 黄金龙 胡晓龙
由谁创建 陈少军 于 2022-05-03 16:44:55
由谁完成 张明磊 于 2022-05-07 16:32:38
由谁取消 暂无
由谁关闭 张明磊 于 2022-05-07 16:34:11
关闭原因 已完成
最后编辑 张明磊 于 2022-05-07 16:34:11
团队 最初预计 总计消耗 预计剩余
工时信息
最初预计 0工时
总计消耗 2.1工时
预计剩余 0工时
预计开始 2022-05-03
实际开始 2022-05-07
截止日期 2022-05-10