У меня есть запрос, который использует функцию предиката, что-то вроде этого:
commentType = 'EL'
AND commentDateTime >= DATEADD(month,datediff(month,0,getdate()) - 13,0)
У меня есть отфильтрованный индекс для commentType, содержащий 40 тыс. Строк, и когда я запускаю запрос, предполагаемое количество строк для поиска по индексу очень точное (около 11 КБ), но для следующего шага (оператор сортировки) он полностью игнорирует статистику и просто оценивает общее количество строк в отфильтрованном индексе.
Почему это происходит? Я знаю основы о sargability , и я проверил только ради здравомыслия, заменив dateadd на фактическую дату (2014-01-01) и вуаля ... Сортировка начала угадывать количество строк правильно ...
Почему это происходит и как я могу это исправить? Я не могу передать фиксированную дату ...
DATEADD(month, -13, DATEADD(day, 1-DATEPART(day, SYSDATETIME()))
и посмотреть, есть ли разница?
(commentType, commentDate)
, он ведет себя там лучше? Просто отфильтрованные индексы могут иногда искажать оценки в разных точках планов. Оценка кажется неправильной, сообщая общее число в отфильтрованном индексе, но на самом деле план показывается неверно.
DATEADD(month,datediff(month,0,getdate()) - 13,0)
не имеет смысла для меня. Что вы пытаетесь сделать с этим? Может ли это быть улучшено / упрощено?