Конференция "Базы" » Запрос, план, замеры. MSSQL [MSSQL]
 
  • ВладОшин © (04.08.14 18:17) [0]
    ------------------------------------------------- запрос
    insert #Q
    select q.Questionniare_ID,q.TimeBegin,q.TimeEnd,q.Call_ID
    from report.dbo.Questionniare q
    where q.TimeBegin between @DateBegin and @DateEnd
    and q.TaskID in (900,984)
    print Convert(varchar(30), DateDiff(second, getdate(), @DT_CNT)) + ':  #Q ';

    insert #Q
    select q.Questionniare_ID,q.TimeBegin,q.TimeEnd,q.Call_ID
    from control.dbo.Questionniare q
    where q.TimeBegin between @DateBegin and @DateEnd
    and q.TaskID in (900,984)
    print Convert(varchar(30), DateDiff(second, getdate(), @DT_CNT)) + ':  #Q2 ';

    insert #D
    select d.Nau_session_id,d.Nau_seance_id,d.TimeBegin,d.TimeEnd,d.WaitAns,Input
    from report.dbo.Dial d
    where d.Questionniare_ID in (select Questionniare_ID from #Q)
    print Convert(varchar(30), DateDiff(second, getdate(), @DT_CNT)) + ':  #D ';

    insert #D
    select d.Nau_session_id,d.Nau_seance_id,d.TimeBegin,d.TimeEnd,d.WaitAns,Input
    from control.dbo.Dial d
    where d.Questionniare_ID in (select Questionniare_ID from #Q)
    print Convert(varchar(30), DateDiff(second, getdate(), @DT_CNT)) + ':  #D2 ';

    insert #CL
    select cl.SESSION_ID,cl.LEG_ID,cl.ENDED
    from Firebird.dbo.call_legs cl with(nolock)
    where 1=1
    and cl.CREATED between @DateBegin and @DateEnd
    and cl.SESSION_ID in ( select Nau_Session_ID from #D  D with (INDEX = IX2_D ))
    print Convert(varchar(30), DateDiff(second, getdate(), @DT_CNT)) + ':  CL ';

    -------------------------------------------------вывод:
    (строк обработано: 4927)
    (строк обработано: 1)
    -8:  #Q
    (строк обработано: 0)
    (строк обработано: 1)
    -8:  #Q2
    (строк обработано: 4897)
    (строк обработано: 1)
    -11:  #D
    (строк обработано: 0)
    (строк обработано: 1)
    -11:  #D2
    (строк обработано: 17511)
    (строк обработано: 1)
    -112:  CL
    ------------------------------

    видно, что самое тяжелое CL, почти 100 секунд
    -----------------

    план (действительный)
    http://uploads.ru/O28Ya.jpg

    ------------------

    вопрос: А как же так?! Почему план (действительный!) показывает 92% на самый первый запрос?
  • junglecat (04.08.14 19:06) [1]
    возможно, оптимизатор 1-й раз кэширует какие-то запросы
    where q.TimeBegin between @DateBegin and @DateEnd
    and q.TaskID in (900,984)
  • sniknik © (04.08.14 20:16) [2]
    поменяй их местами последний первым и т.д. если это кеш и первые запросы в память с сохранением на последнем (или ожиданием завершения) то будет то же самое. т.е. большее время опять будет на последнем, который сейчас первый.

    +
    кстати
    > where 1=1
    ?
    нафига? вообще тогда условие убери.
  • junglecat (04.08.14 20:30) [3]
    > where 1=1

    издержки формирования запроса динамически в коде?
    сиквельный оптимизатор наверно должен сам это убрать
  • ВладОшин © (04.08.14 21:15) [4]

    > поменяй их местами

    нельзя
    D на основе Q
    CL на основе D

    > where 1=1
    оптимизатор убирает
    а так удобнее условия and дописывать/коментировать
    просто первый and закоментишь - ругается. А так нет
    но это ладно

    просто..  ладно бы это был ожидаемый план. Так действительный же..
    Кэш.. Ну да, наверное.. как иначе объяснить
  • Inovet © (04.08.14 22:25) [5]
    > [4] ВладОшин ©   (04.08.14 21:15)
    > а так удобнее условия and дописывать/коментировать
    > просто первый and закоментишь - ругается. А так нет

    where
     cond1
    //  and cond2
     and cond3
    ; // тоже для удобства отладки
  • Inovet © (04.08.14 22:26) [6]
    Ну ты это и написал же.
  • ВладОшин © (05.08.14 09:03) [7]
    а если cond1 теперь надо закомментировать, то придется что-то еще менять
    можно так еще попробовать привыкнуть

    where
    cond1 and
    cond2 and
    cond3

    тогда

    where
    -- cond1 and
    cond2 and
    cond3
    и прокатит

    но

    where
    cond1 and
    cond2 and
    -- cond3
    и опять надо подправлять

    а
    where 1=1
    and cond1
    and cond2
    and cond3
    любое комментим, и ничего не правим, что бы посмотреть как оно получится

    и логично, имхо:
    Выбери [все]  
       и [что бы 1]
       и [что бы 2]
       и [что бы 3]
  • sniknik © (05.08.14 09:54) [8]
    для, именно отладки(/тестирования) нужно стараться избегать лишнего. особенно когда возникает что то странное.
    проблема может быть именно в этом на первый взгляд понятном коде. врядли конечно, но я к примеру встречал ситуацию когда приблизительно такой код вводил sql сервер (уж не помню какой но скорее всего информикс, больше всего "непоняток" было с ним) в "ступор", оптимизатор почему то считал это вычисляемым условием, что приводило к перебору всей таблицы несмотря на то, что следующее условие явно указывало на единичную выборку по ключу.
  • ВладОшин © (06.08.14 15:44) [9]
    переписал нормально, без 1=1.
    Из кэша за сутки точно вылетело все.

    Результат тот же.
    (даже по секундам хуже)

    >  from Firebird.dbo.call_legs
    это табла постоянно пополняется из FB БД (кроме того что большая весьма)
    походу он не может зафиксировать момент когда записываться закончит (пишется постоянно, причем не нами, а "ими". Для них доступ открыт на запись, а не для нас к ним на чтение)
 
Конференция "Базы" » Запрос, план, замеры. MSSQL [MSSQL]
Есть новые Нет новых   [119006   +11][b:0][p:0]