Cześć, napotkałem ostatnio na ciekawy przypadek i chciałbym wiedzieć dlaczego tak się dzieje.
Mam procedure z 2 patrametrami datowymi: @dataOd i @dataDo (oba mają typ DATE). W klauzuli 'where' używam ich do zawężenia wyników:
WHERE dataModyfikacji BETWEEN @dataOd AND @dataDo
dataModyfikacji ma typ datetime. Wykonuje tą procedurę za ostatnie 5 dni (czyli daty 2020-06-18 i 2020-06-22) i mieli mi ok 50 sekund, gdzie w wyniku otrzymuje tylko ok. 11 tys. rekordów.W ramach porównania robie sobie tą procedure ale już bez parametrów, w where używam GETDATE() - robię to aby sprawdzić czy w taki sposób zadziała szybciej:
WHERE dataModyfikacji >= GETDATE()-5
Okazuje się, że zapytanie wykonało mi się w kilka sekund. I teraz moje pytanie - czemu używając parametrów datowych z BETWEEN tak zamula zapytanie? I najważniejsze - co mogę zrobić aby przy tej parametryzacji na datach wykonywało mi się szybciej?
Próbowałem z WITH RECOMPILE ale nie przyspieszyło (chodzi o parameter sniffing). Jakby co mam pozakładane wszystkie indeksy (sprawdzałem na Execution Plan).
I pytanie na koniec - czy lepiej w where konwertowac datetime na date czy nie ma to znaczenia, tzn:
WHERE dataModyfikacji >= '2020-06-15'
czy
WHERE CONVERT(DATE,dataModyfikacji) >= '2020-06-15'