Mam zapytanie, które korzysta z funkcji w predykacie, mniej więcej tak:
commentType = 'EL'
AND commentDateTime >= DATEADD(month,datediff(month,0,getdate()) - 13,0)
Mam filtrowany indeks na commentType, który ma 40 tys. Wierszy, a kiedy uruchamiam zapytanie, szacunkowa liczba wierszy dla szukania indeksu jest bardzo dokładna (około 11 tys.), Ale w następnym kroku (operator sortowania) całkowicie ignoruje statystyki i po prostu szacuje całkowitą liczbę wierszy w przefiltrowanym indeksie.
Dlaczego to się dzieje? Znam podstawy dotyczące sargability i przetestowałem dla zachowania rozsądku, zastępując dateadd rzeczywistą datą (01.01.2014) i voila ... Sortowanie zaczęło poprawnie zgadywać liczbę wierszy ...
Dlaczego tak się dzieje i jak mogę to naprawić? Nie mogę podać ustalonej daty ...
DATEADD(month, -13, DATEADD(day, 1-DATEPART(day, SYSDATETIME()))
sprawdzić, czy jest jakaś różnica?
(commentType, commentDate)
, czy działa tam lepiej? Po prostu filtrowane indeksy mogą czasem błędnie zgłaszać szacunki w różnych punktach planów. Oszacowanie wydaje się wyjściem, zgłaszając całkowitą liczbę w przefiltrowanym indeksie, ale tak naprawdę plan jest wyświetlany nieprawidłowo.
DATEADD(month,datediff(month,0,getdate()) - 13,0)
nie ma dla mnie sensu. Co próbujesz z tym zrobić? Czy można to poprawić / uprościć?