Проблема производительности с SQL-запросом - PullRequest
0 голосов
/ 23 июня 2019

Я извлекаю данные из двух таблиц - Прогноз и Заказы для вычисления точности прогноза продаж

Шаги, которые я предпринимаю:

  1. Определение всех исчерпывающих комбинаций месяца продукт-регион-спрос ч / б для обоих наборов данных ... давайте назовем это (1)

  2. Определение различных снимков прогноза в данных прогноза ... давайте назовем это (2)

  3. Выполнение перекрестного соединения (1) и (2) ... назовем это (3)

  4. Выполнение эквивалента "SUMIF ()" в строках из (3) как для заказов, так и для прогноза. Например, если я сравниваю прогноз с фактическими заказами за февраль,

Янв. Прогноз INDPOR ---> Для некоторых продуктов / регионов-фев. Комбинация поставок: февральский прогноз (сгенерирован в январе) и заказы, забронированные после 1 января, с графиком поставок в феврале

Февраль Прогноз "INDPOR" ---> Для того же продукта / региона - февраль Дата поставки Комбинация: февральский прогноз (сгенерированный в феврале) и заказы, забронированные после 27 января * с графиком доставки в феврале

Примечание 1: создание нескольких прогнозов на один и тот же месяц

Примечание 2: Используемые определения фискального календаря; поэтому февраль начинается 27 января

Вывод генерируется правильно. Но это мучительно медленно (1 час +). Пожалуйста, помогите мне настроить это и сделать это быстрее, так как мне нужно будет использовать это и для больших наборов данных.

Другие детали:

  1. Я запускаю это на SQL Server 2014 локально со своего рабочего стола. Загрузка с помощью мастера импорта данных SQL в SQL из файла Excel в настоящее время
  2. Входные данные прогноза: ForecastAggTable
  3. Входные данные заказов: OrderAggTable

Входные и выходные файлы

Код:

Select * 
from
    (

            Select *,

            (Select isnull(sum([Forecast Qty]),0) from ForecastAggTable t2 where t2.LOB=D.LOB and
                    t2.[Demand Month]=D.[Demand Month] and t2.Class=D.Class 
                    and t2.[Item Type]=D.[Item Type] and t2.[LoB Region]=D.[LoB Region] and
                    t2.[Key Account]=D.[Key Account] and t2.Country=D.Country 
                    and t2.[Master Customer]=D.[Master Customer] and t2.[INDPOR Version]=D.[INDPOR Version])[Forecast Qty],

            (
                    Select isnull(sum([Order Qty]),0) from OrderAggTable t1 where t1.LOB=D.LOB and
                    t1.[SAD Month]=D.[Demand Month] and t1.Class=D.Class 
                    and t1.[Item Type]=D.[Item Type] and t1.[LoB Region]=D.[LoB Region] and
                    t1.[Key Account]=D.[Key Account] and t1.Country=D.Country 
                    and t1.[Master Customer]=D.[Master Customer] and t1.[Book Date]>=D.[INDPOR Timestamp]
            )[SAD-OrderQty],

            (
                    Select isnull(sum([Order Revenue]),0) from OrderAggTable t1 where t1.LOB=D.LOB and
                    t1.[SAD Month]=D.[Demand Month] and t1.Class=D.Class 
                    and t1.[Item Type]=D.[Item Type] and t1.[LoB Region]=D.[LoB Region] and
                    t1.[Key Account]=D.[Key Account] and t1.Country=D.Country 
                    and t1.[Master Customer]=D.[Master Customer] and t1.[Book Date]>=D.[INDPOR Timestamp]
            )[SAD-OrderRevenue],


            (
                    Select isnull(sum([Order Qty]),0) from OrderAggTable t1 where t1.LOB=D.LOB and
                    t1.[RDD Month]=D.[Demand Month] and t1.Class=D.Class 
                    and t1.[Item Type]=D.[Item Type] and t1.[LoB Region]=D.[LoB Region] and
                    t1.[Key Account]=D.[Key Account] and t1.Country=D.Country 
                    and t1.[Master Customer]=D.[Master Customer] and t1.[Book Date]>=D.[INDPOR Timestamp]
            )[RDD-OrderQty],

            (
                    Select isnull(sum([Order Revenue]),0) from OrderAggTable t1 where t1.LOB=D.LOB and
                    t1.[RDD Month]=D.[Demand Month] and t1.Class=D.Class 
                    and t1.[Item Type]=D.[Item Type] and t1.[LoB Region]=D.[LoB Region] and
                    t1.[Key Account]=D.[Key Account] and t1.Country=D.Country 
                    and t1.[Master Customer]=D.[Master Customer] and t1.[Book Date]>=D.[INDPOR Timestamp]
            )[RDD-OrderRevenue]


            from
            (
            Select distinct LOB,[INDPOR Version],[INDPOR Timestamp],[Demand Month],
            [Demand Quarter],[Min Date],Class,[Item Type],[Offer PF],
            [LoB Region],[Key Account],Country,[Master Customer]

            from

            (

                            Select V.LOB,V.[SAD Month][Demand Month],V.[SAD Quarter][Demand Quarter],V.[SAD Min Date][Min Date],V.Class,
                            [Item Type],[Offer PF],[LoB Region],[Key Account],Country,[Master Customer]
                            from OrderAggTable V

                            union

                            (
                            Select Z.LOB,Z.[RDD Month][Demand Month],Z.[RDD Quarter][Demand Quarter],Z.[RDD Min Date][Min Date],Z.Class,
                            [Item Type],[Offer PF],[LoB Region],[Key Account],Country,[Master Customer]
                            from OrderAggTable Z
                            )

                            union

                            (
                            Select LOB,[Demand Month],[Demand Quarter],[Min Date],Class[Class],[Item Type],[Offer PF],[LoB Region],
                            [Key Account],Country,[Master Customer] from ForecastAggTable
                            )
            )A

            cross join

            (
            select distinct [INDPOR Version],[INDPOR Timestamp] 
            from ForecastAggTable
            )B
            )D
            where [Min Date]>=[INDPOR Timestamp]
            )E
            where ([SAD-OrderQty] +  [RDD-OrderQty] + [Forecast Qty]<>0)

1 Ответ

0 голосов
/ 24 июня 2019

Как насчет упрощения и выполнения меньшего количества проходов ваших таблиц.

В этом примере я делаю два сканирования таблицы прогнозов, одно для отдельного и одно для объединения, и одно сканирование заказовстол.

with cte as
(
 select distinct [INDPOR Version],[INDPOR Timestamp] 
            from ForecastAggTable
)
,cte2 as
(
Select 
    V.LOB
    ,iif(DUP=0,V.[SAD Month]    ,V.[RDD Month]      )   [Demand Month]
    ,iif(DUP=0,V.[SAD Quarter]  ,V.[RDD Quarter]    )   [Demand Quarter]
    ,iif(DUP=0,V.[SAD Min Date] ,V.[RDD Min Date]   )   [Min Date]
    ,V.[Book Date]
    ,V.Class
    ,V.[Item Type]
    ,V.[Offer PF]
    ,V.[LoB Region]
    ,V.[Key Account]
    ,V.Country
    ,V.[Master Customer]
    ,null [INDPOR Version]
    ,null [Forecast Qty]
    ,iif(DUP=0,v.[Order Qty]    ,null   )       [SAD-OrderQty]
    ,iif(DUP=0,V.[Order Revenue]    ,null   )   [SAD-OrderRevenue]
    ,iif(DUP=1,V.[Order Qty]    ,null   )       [RDD-OrderQty]
    ,iif(DUP=1,V.[Order Revenue]    ,null   )   [RDD-OrderRevenue]
from OrderAggTable V
cross join (select dup from (values (0),(1))a(dup)) a
union all
Select 
    LOB
    ,[Demand Month]
    ,[Demand Quarter]
    ,[Min Date]
    ,[Min Date]
    ,Class
    ,[Item Type]
    ,[Offer PF]
    ,[LoB Region]
    ,[Key Account]
    ,Country
    ,[Master Customer] 
    ,[INDPOR Version]
    ,[Forecast Qty] 
    ,null[SAD-OrderQty]
    ,null[SAD-OrderRevenue]
    ,null[RDD-OrderQty]
    ,null[RDD-OrderRevenue]
    from ForecastAggTable
)
select
    cte2.LOB
    ,cte.[INDPOR Version]
    ,cte.[INDPOR Timestamp]
    ,cte2.[Demand Month]
    ,cte2.[Demand Quarter]
    ,cte2.[Min Date]
    ,cte2.Class
    ,cte2.[Item Type]
    ,cte2.[Offer PF]
    ,cte2.[LoB Region]
    ,cte2.[Key Account]
    ,cte2.Country
    ,cte2.[Master Customer]
    ,isnull(sum(cte2.[Forecast Qty]    ),0) [Forecast Qty]     
    ,isnull(sum(cte2.[SAD-OrderQty]    ),0) [SAD-OrderQty]
    ,isnull(sum(cte2.[SAD-OrderRevenue])    ,0) [SAD-OrderRevenue]
    ,isnull(sum(cte2.[RDD-OrderQty]    ),0) [RDD-OrderQty]     
    ,isnull(sum(cte2.[RDD-OrderRevenue])    ,0) [RDD-OrderRevenue]
from cte2
inner join cte
on cte2.[Book Date]>=cte.[INDPOR Timestamp]
where isnull(cte2.[INDPOR Version],cte.[INDPOR Version])=cte.[INDPOR Version]
group by    
     cte2.LOB
    ,cte2.[Demand Month]
    ,cte2.[Demand Quarter]
    ,cte2.[Min Date]
    ,cte2.Class
    ,cte2.[Item Type]
    ,cte2.[Offer PF]
    ,cte2.[LoB Region]
    ,cte2.[Key Account]
    ,cte2.Country
    ,cte2.[Master Customer]
    ,cte.[INDPOR Version]
    ,cte.[INDPOR Timestamp]
having 
    isnull(sum(cte2.[Forecast Qty]     ),0) + 
    isnull(sum(cte2.[SAD-OrderQty]     ),0) +
    isnull(sum(cte2.[RDD-OrderQty]     ),0) 
    !=0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...