• Sergey2 (13.08.09 17:05) [0]
    Есть таблица в которой 10.000.000 записей. Необходимо выбирать из неё записи по условию фильтрации по полю типа datetime.


    declare @currDate datetime
    set @currdate = getdate()

    declare @priorDate datetime
    set @priorDate = (getdate() - 30)

    select field1, field2, filldata
    from MyTable
    where filldata < @currdate and filldata > @priorDate



    Возвращается в результате выборки несколько записей. Запрос выполняется секунд 40-50. что очень медленно.
    Какие пути решения ? каким образом можно уменьшить время выполнения запроса? почитал про checksum. попробовал.

    Получилось примерно следующее.



    declare @currDate datetime
    set @currdate = getdate()

    declare @priorDate datetime
    set @priorDate = (getdate() - 30)

    select *
    from
    (select field1, field2, checksum(filldata  collate database_default) filldateHash
    from MyTable) as mt
    where mt.filldateHash < checksum(@currdate) and
    mt.filldateHash > checksum(@priorDate)




    Запрос то теперь этот быстро выполняется. только вот


    where mt.filldateHash < checksum(@currdate) and
    mt.filldateHash > checksum(@priorDate)


    ну никак не выполняется.
  • Ega23 © (13.08.09 17:08) [1]
    Индекс на это поле наложи.
  • Павел Калугин © (14.08.09 00:01) [2]
    1. вместо
    > (getdate() - 30)

    dateadd(dd,-30,getdate())

    2. что получить то надо? данные за период?
    если так то накой черт checksum? смотрел что он возвращает?
    а план 1-го запроса смотрел? где тормозит?
    совет
    > [1] Ega23 ©   (13.08.09 17:08)
Есть новые Нет новых   [134477   +38][b:0][p:0.001]