首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >运行总库存性能较低- SQL Server 2016

运行总库存性能较低- SQL Server 2016
EN

Stack Overflow用户
提问于 2020-08-03 23:14:39
回答 1查看 50关注 0票数 0

我有一个inventory表,其中包含一个按LocGroup分组的运行数量列,如图1所示

我想要获取每天的总库存,然后查看最终结果图2。示例:我可以在2019-10-21上看到总库存为11,细分为GroupA -1和GroupB 12

我已经创建了可以工作的代码,但是当我在100,000+记录上运行时,它真的很慢,有没有更好的方法来做到这一点?

我猜目前的方法很慢,因为b.EntryDate <= a.EntryDate每次都在求和。

我当前的代码:

代码语言:javascript
运行
复制
with cte_1 -- Get Total Stock Position not Grouped
as
(
    SELECT [CmpID],[EntryDate] ,[ProductID],[ColourCode]
    ,SUM([Quantity]) OVER(PARTITION BY [CmpID],[ProductID],[ColourCode] ORDER BY [EntryDate]) [TOTAL Running Quantity]
    FROM [dbo].[Inventory]
)
,cte_2 -- Get Stock Breakdown for each Day from cte_1
as
(
    SELECT a.[CmpID],a.[EntryDate],a.[ProductID],a.[ColourCode],a.[TOTAL Running Quantity],b.[LocGroup],MAX(b.[EntryDate]) as [MaxDate]
    FROM cte_1 a
    LEFT OUTER JOIN [dbo].[Inventory] b
    on a.[CmpID] = b.[CmpID]
    and a.[ProductID] = b.[ProductID]
    and a.[ColourCode] = b.[ColourCode]
    and b.[EntryDate] <= a.[EntryDate]
    GROUP BY a.[CmpID],a.[EntryDate],a.[ProductID],a.[ColourCode],a.[TOTAL Running Quantity],b.[LocGroup]
)

SELECT a.[CmpID],a.[EntryDate],a.[ProductID],a.[ColourCode],a.[TOTAL Running Quantity],a.[LocGroup],b.[Running Quantity]
FROM cte_2 a
LEFT OUTER JOIN [dbo].[Inventory] b
on a.[CmpID] = b.[CmpID]
and a.[ProductID] = b.[ProductID]
and a.[ColourCode] = b.[ColourCode]
and a.[LocGroup] = b.[LocGroup]
and b.[EntryDate] = a.[MaxDate]
ORDER BY a.[ColourCode], a.[EntryDate], a.[LocGroup]
EN

回答 1

Stack Overflow用户

发布于 2020-08-03 23:29:56

实时计算所有数据的统计数据总是很昂贵的,而且随着数据的增长会变得更糟。最好在另一个表中保留一个运行统计信息,并在将记录插入到您的表中时修改这些统计信息。例如,当您在表中插入新行时,如果统计表中不存在该日,则插入该日的记录。如果这一天已经存在于你的统计表中,那么只需要更新那一天的计数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63232126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档