Низкая производительность общей инвентаризации - SQL Server 2016 - PullRequest
0 голосов
/ 03 августа 2020

У меня есть инвентарная таблица с группировкой столбцов "Текущее количество" по [LocGroup], см. Изображение 1

Image 1

I want to get the Total Inventory for each day and then the LocGroup breakdown see final result Image 2. Example: I can see on the 2019-10-21 Total Inventory was 11 and breakdown was GroupA -1 and GroupB 12

Изображение 2

Я создал код, который работает, но когда я запускаю более 100 000 записей, он очень медленный, есть ли лучший способ сделать это?

Я предполагаю, что текущий способ медленный as и b. [EntryDate] <= a. [EntryDate] суммирует все каждый раз. </p>

Мой текущий код:

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]

1 Ответ

0 голосов
/ 03 августа 2020

Расчет статистики в реальном времени по всем данным всегда будет дорогостоящим и будет ухудшаться по мере роста ваших данных. Лучше сохранить текущую статистику c в другой таблице и изменять эту статистику по мере добавления записей в вашу таблицу. Например, когда вы вставляете новую строку в свою таблицу, если этот день не существует в вашей таблице статистики, вставьте запись для этого дня. и если день уже существует в вашей таблице статистики, просто обновите счетчики за этот день.

...