Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

можно как-то сделать быстрее? [MSSQL]


12 ©   (2009-12-31 11:32:00) 

этот кусок вызывает тормоза, время выполнения ~ 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


ANB   (2010-01-11 12:32:00) [1]

when сам по себе практически не дает нагрузки.
Смотреть план запроса на предмет связок и использования индексов


anonims   (2010-01-11 11:50:00) [2]

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), ...


stas   (2010-01-03 20:57:00) [3]

>что смущает, так это практически идентичные when-then
В первую очередь должно смущать это:
Where
J.Product = @Product and
D.Shift <= @Shift and
D.Deleted = 0 and
D.InUse = 0 and
D.UnderConstruction = 0

Индексы в правильном порядке проставлены?
если все же смущает  when-then, то убери и проверь прирост скорости


Anatoly Podgoretsky   (2009-12-31 15:08:00) [4]

По Дельфи вопрос есть?


12   (2009-12-31 12:42:00) [5]

@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
наблюдаю практически везде
сложно сказать пока, почему кластерные оказались другими


clickmaker   (2009-12-31 11:54:00) [6]

@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)

ну и план надо смотреть. где наибольшие издержки.
может, индексы стоит повесить


Наверх

Титульная страница Поиск, карта сайта Написать письмо