重现步骤

[步骤]

消耗CPU 最多 


DECLARE @CustomerID int

                            declare @Start int,@Limit int,@Total int

                            set @Start=1

                            set @Limit=10000

                            set @CustomerID=1 

IF OBJECT_ID('Tempdb..#tempSkuRange') IS NOT NULL

                        DROP TABLE #tempSkuRange;

                        IF OBJECT_ID('Tempdb..#temp_Procurement') IS NOT NULL

                        DROP TABLE #temp_Procurement;

                        IF OBJECT_ID('Tempdb..#tempActiveInfo') IS NOT NULL

                        DROP TABLE #tempActiveInfo;

                        IF OBJECT_ID('Tempdb..#tempSkuRangeOrder') IS NOT NULL

                        DROP TABLE #tempSkuRangeOrder;

create table #tempSkuRange(SKU varchar(50) COLLATE Chinese_PRC_CI_AS) 

                        create table #tempSkuRangeOrder(SKU varchar(50) COLLATE Chinese_PRC_CI_AS,Num int) 

                        create table #temp_Procurement(P_Code varchar(50) COLLATE Chinese_PRC_CI_AS,SKU varchar(30) COLLATE Chinese_PRC_CI_AS,SingleNum int,ActualBuyNum int,ProductNum int,PutNum int,ProcNum INT,WarehouseID INT)  

                        create table #tempActiveInfo(SKU varchar(50) COLLATE Chinese_PRC_CI_AS,PutTime datetime,ShipTime datetime,ActiveTime DATETIME,WarehouseID INT)

insert into #tempSkuRange select distinct SKU from RB_Warehouse_Product (nolock) where len(SKU)>0 and CustomerID=@CustomerID AND WareHouseID IN(SELECT id FROM dbo.RB_WareHouse (nolock) WHERE WareHouseType=1)

                            insert into #tempSkuRangeOrder(Num,SKU) SELECT ROW_NUMBER() OVER(order by SKU) AS Num,SKU from #tempSkuRange (nolock)

select @Total=COUNT(*) from #tempSkuRange

                            while @Start<=@Total

                            BEGIN

                            insert into #temp_Procurement(SKU,P_Code,SingleNum,ActualBuyNum,ProductNum,PutNum,ProcNum,WarehouseID)

                                                                    select SKU,P_Code,SingleNum,ActualBuyNum,ProductNum,PutNum,ProcNum,d.WareHouseID from (select  a.SKU,a.P_Code,a.SingleNum,a.ActualBuyNum,a.ProductNum,a.PutNum,(SELECT MAX(ProcNum)

                                                                    FROM ( VALUES ( SingleNum), ( ActualBuyNum),(ProductNum) ) AS ProcNum (ProcNum)) AS ProcNum,c.WareHouseID from RB_Procurement_Detail a (nolock)

                                                                    inner join RB_Procurement_List c (nolock) on a.CustomerID=c.CustomerID and a.P_Code=c.P_Code

                                                                    inner join (SELECT * from #tempSkuRangeOrder where Num>=@Start and Num<@Start+@Limit) b on a.SKU=b.SKU where a.CustomerID=@CustomerID and c.FinishStatus<>1

                                                                    union all

                                                                    select  a.SKU,a.P_Code,0 SingleNum,0 ActualBuyNum,0 ProductNum,0 PutNum,0 ProcNum,c.WareHouseID from RB_Procurement_Detail a (nolock)

                                                                    inner join RB_Procurement_List c (nolock) on a.CustomerID=c.CustomerID and a.P_Code=c.P_Code

                                                                    inner join (SELECT * from #tempSkuRangeOrder where Num>=@Start and Num<@Start+@Limit) b on a.SKU=b.SKU where a.CustomerID=@CustomerID and c.FinishStatus=1) d                         

                            set @Start=@Start+@Limit-1

                            END

   insert into #tempActiveInfo(SKU,PutTime,ShipTime,ActiveTime,WarehouseID)

                                                                    select isnull(p.SKU,q.SKU) SKU,p.PutTime,q.ShipTime,(SELECT MAX(ActiveTime)

                                                                    FROM (VALUES (PutTime), (ShipTime)) AS ActiveTime (ActiveTime)) AS ActiveTime,ISNULL(p.WareHouseID,q.WareHouseID) WareHouseID from 

                                                                    (select a.SKU,b.WareHouseID,MAX(a.AddTime) as PutTime from RB_Procurement_Detail_PutList a (nolock) INNER JOIN RB_Procurement_List b (NOLOCK) ON a.CustomerID=b.CustomerID AND a.P_Code=b.P_Code

                                                                    where IsDeleted=0 and a.CustomerID=@CustomerID group by a.SKU,b.WareHouseID) p

                                                                    full outer join

                                                                    (select b.SKU,a.WareHouseID,MAX(a.ShipTime) ShipTime from RB_Procurement_Order_Package a (nolock) inner join RB_Procurement_Order_Package_Detail b (nolock) on a.ID=b.PackageID 

                                                                    where a.CustomerID=@CustomerID and a.PackageState=3 group by a.WareHouseID,b.SKU) q on p.SKU=q.SKU AND p.WareHouseID=q.WareHouseID

 select p.SKU,p.WarehouseID,ISNULL(p.PutNum,0) PutNum,isnull(p.ProcessingNum,0) ProcessingNum,isnull(p.TotalProcNum,0) TotalProcNum,p.ActiveTime,p.PutTime,p.ShipTime from (

                                                        select isnull(t1.SKU,t2.SKU) SKU,ISNULL(t1.WarehouseID,t2.WarehouseID) WarehouseID,t1.PutNum,t1.ProcessingNum,t1.TotalProcNum,t2.ShipTime,t2.ActiveTime,t2.PutTime from 

                                                        (select SKU,WarehouseID,SUM(PutNum) PutNum,sum(ProcNum) TotalProcNum,(sum(ProcNum)-sum(PutNum)) ProcessingNum from #temp_Procurement group by WarehouseID,SKU) t1

                                                        full outer join #tempActiveInfo t2 on t1.SKU=t2.SKU AND t1.WarehouseID=t2.WarehouseID) p inner join #tempSkuRange q on p.SKU=q.SKU

DELETE a from RB_Warehouse_Product_ActiveInfo a where a.CustomerID=@CustomerID and not exists(select SKU from #tempActiveInfo b where a.SKU=b.SKU AND a.WarehouseID=b.WarehouseID)

IF OBJECT_ID('Tempdb..#tempSkuRange') IS NOT NULL

                            DROP TABLE #tempSkuRange;

                            IF OBJECT_ID('Tempdb..#temp_Procurement') IS NOT NULL

                            DROP TABLE #temp_Procurement;

                            IF OBJECT_ID('Tempdb..#tempActiveInfo') IS NOT NULL

                            DROP TABLE #tempActiveInfo;

                            IF OBJECT_ID('Tempdb..#tempSkuRangeOrder') IS NOT NULL

                            DROP TABLE #tempSkuRangeOrder;


[结果]


[期望]

优化SQL减少开销损耗
历史记录  
  1. 2024-09-27 09:37:04, 由 袁慧斌 创建。
  2. 2024-09-27 09:37:38, 由 李乐同 指派给 程伟。
    修改了 指派给,旧值为 "liletong",新值为 "chengwei"。
  3. 2024-09-27 10:27:01, 由 程伟 指派给 谢业福。
    修改了 指派给,旧值为 "chengwei",新值为 "xieyefu"。
  4. 2024-09-27 15:44:22, 由 谢业福 指派给 何建宝。
    修改了 指派给,旧值为 "xieyefu",新值为 "hejianbao"。
  5. 2024-09-27 15:47:32, 由 何建宝 编辑。
    修改了 解决时效,旧值为 "0",新值为 "-1"。
    修改了 指派给 ,旧值为 "hejianbao",新值为 "xieyefu"。
  6. 2024-09-27 15:52:32, 由 谢业福 指派给 程伟。
    修改了 指派给,旧值为 "xieyefu",新值为 "chengwei"。
  7. 2024-09-27 16:08:09, 由 程伟 指派给 赵喜。
    修改了 指派给,旧值为 "chengwei",新值为 "zhaoxi"。

    以前是建宝开发的,逻辑很复杂,需要让建宝给我们交接下,了解下业务之后,才知道怎么去优化,建议转成需求优化


  8. 2024-09-27 19:10:49, 由 赵喜 转为 需求,编号为 #23995 WMS:性能优化-仓库产品活跃信息查询处理业务缓慢 执行时间 较长,消耗大量CPU 导致其他业务阻塞 。
  9. 2024-09-27 19:10:49, 由 赵喜 关闭。
所属项目 技术中心-需求池
所属模块 供应链   仓储物流
所属计划
所属迭代
Bug类型
严重程度 一般
优先级 P1
Bug状态 已关闭
业务部门
影响功能
开发责任人 赵喜
测试责任人
解决时效 0
激活次数 0
激活日期
是否确认 否
当前指派 Closed 于 2024-09-27 19:10:49
截止日期 0000-00-00
上线时间 0000-00-00 00:00:00
上线时效 -1
操作系统
浏览器
关键词
抄送给
所属迭代
相关需求
相关任务
由谁创建 袁慧斌 于 2024-09-27 09:37:03
影响环境 577
由谁解决 赵喜 于 2024-09-27 19:10:49
解决版本
解决方案 tostory
由谁关闭 赵喜 于 2024-09-27 19:10:49
最后修改 程伟 于 2024-09-27 16:07:57