Конференция "Базы" » можно как-то сделать быстрее? [MSSQL]
 
  • 12 © (31.12.09 11:32) [0]
    этот кусок вызывает тормоза, время выполнения ~ 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
  • clickmaker © (31.12.09 11:54) [1]
    @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)

    ну и план надо смотреть. где наибольшие издержки.
    может, индексы стоит повесить
  • 12 © (31.12.09 12:42) [2]
    @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
    наблюдаю практически везде
    сложно сказать пока, почему кластерные оказались другими
  • Anatoly Podgoretsky © (31.12.09 15:08) [3]
    По Дельфи вопрос есть?
  • stas © (03.01.10 20:57) [4]
    >что смущает, так это практически идентичные when-then
    В первую очередь должно смущать это:
    Where
    J.Product = @Product and
    D.Shift <= @Shift and
    D.Deleted = 0 and
    D.InUse = 0 and
    D.UnderConstruction = 0


    Индексы в правильном порядке проставлены?
    если все же смущает  when-then, то убери и проверь прирост скорости
  • anonims (11.01.10 11:50) [5]
    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), ...
  • ANB (11.01.10 12:32) [6]
    when сам по себе практически не дает нагрузки.
    Смотреть план запроса на предмет связок и использования индексов
 
Конференция "Базы" » можно как-то сделать быстрее? [MSSQL]
Есть новые Нет новых   [134435   +33][b:0][p:0.001]