-
этот кусок вызывает тормоза, время выполнения ~ 4,5 секунды. И около 5 секунд всего на SP. Select @Qty = Sum(Case When D.CLocal = 1 and D.DLocal = 1 and J.Iteration = 0 Then 0 When D.CLocal = 1 and D.CClient = 0 and J.Iteration >= 0 Then J.Move When D.DLocal = 1 and D.DClient = 0 and J.Iteration <= 0 Then -J.Move Else 0 End), @Cost1 = Sum(Case When D.CLocal = 1 and D.DLocal = 1 and J.Iteration = 0 Then 0 When D.CLocal = 1 and D.CClient = 0 and J.Iteration >= 0 Then J.Sum1 When D.DLocal = 1 and D.DClient = 0 and J.Iteration <= 0 Then -J.Sum1 Else 0 End), @Cost2 = Sum(Case When D.CLocal = 1 and D.DLocal = 1 and J.Iteration = 0 Then 0 When D.CLocal = 1 and D.CClient = 0 and J.Iteration >= 0 Then J.Sum2 When D.DLocal = 1 and D.DClient = 0 and J.Iteration <= 0 Then -J.Sum2 Else 0 End), @CostTax = Sum(Case When D.CLocal = 1 and D.DLocal = 1 and J.Iteration = 0 Then 0 When D.CLocal = 1 and D.CClient = 0 and J.Iteration >= 0 Then J.SumTax When D.DLocal = 1 and D.DClient = 0 and J.Iteration <= 0 Then -J.SumTax Else 0 End) From Journal J with(NOLOCK) Inner Join Document D with(NOLOCK) on J.Document = D.Document Where J.Product = @Product and D.Shift <= @Shift and D.Deleted = 0 and D.InUse = 0 and D.UnderConstruction = 0
что смущает, так это практически идентичные when-then
-
@Qty = Sum(Case When D.CLocal = 1 and D.DLocal = 1 and J.Iteration = 0 Then 0 When D.CLocal = 1 and D.CClient = 0 Then J.Move * SIGN(J.Iteration)
ну и план надо смотреть. где наибольшие издержки. может, индексы стоит повесить
-
@Qty = Sum(Case When D.CLocal = 1 and D.DLocal = 1 and J.Iteration = 0 Then 0 When D.CLocal = 1 and D.CClient = 0 and J.Iteration >= 0 Then J.Move When D.DLocal = 1 and D.DClient = 0 and J.Iteration <= 0 Then -J.Move Else 0 End),
точно, это вообще идентично @Qty = Sum(Case When D.CLocal = 1 and D.CClient = 0 Then J.Move * SIGN(J.Iteration) else 0 end)
с индексами проблема - индексы есть но кластерные не используются тут, они логически для других случаев
хотя вот это from Journal J Join Document D on J.Document = D.Document наблюдаю практически везде сложно сказать пока, почему кластерные оказались другими
-
По Дельфи вопрос есть?
-
>что смущает, так это практически идентичные when-then В первую очередь должно смущать это: Where
J.Product = @Product and
D.Shift <= @Shift and
D.Deleted = 0 and
D.InUse = 0 and
D.UnderConstruction = 0 Индексы в правильном порядке проставлены? если все же смущает when-then, то убери и проверь прирост скорости
-
When D.CLocal = 1 and D.CClient = 0 Then J.Move * SIGN(J.Iteration)
D.CLocal = 1 and D.CClient = 0 перенести в WHERE (другие нам не нужны, т.к. ELSE 0 )
останется sum(SIGN(j.iteration)*j.move), sum(sign()*sum1), ...
-
when сам по себе практически не дает нагрузки. Смотреть план запроса на предмет связок и использования индексов
|