Cześć. Mam funkcję skalarną, która jest wykonywana podczas selectu. Przy 8000 rekordów z hakiem, trwa to około 40 sekund, więc zacząłem się przyglądać, jak to zoptymalizować. Nie znalazłem właściwie nic, więc spojrzałem na plan wykonania.
I oto okazało się coś ciekawego.
Moje zapytanie wygląda mniej więcej tak:
select ve.date as dat1, MIN(ve2.date) as dat2, ve.includeWT
from Events as ve
inner join Events as ve2 on ve.eID = ve2.eID and
ve.Date<ve2.date
where ve.date>='2010-05-04 08:42:01' and ve.date<='2010-05-04 16:39:33'
and ve2.date>='2010-05-04 08:42:01' and ve2.date<='2010-05-04 16:39:33'
and ve.eID = 117 and ve2.eid = 117
group by ve.eID, ve.date, ve.includeWT
Nie ważne co robi. Chodzi o filtr.
W pierwszym kroku plan pokazał Index Seek i pod nim Clustered Index Seek na tabeli Events.
Ilość rekordów, jakie zwróciła ta operacja jest równa podanemu przeze mnie zakresowi dat. Tylko. Czyli nie wziął pod uwagę pola EID.
Następnym krokiem jest Nested Loops(Inner Join), a następnym Filter i dopiero tutaj bierze pod uwagę pole EID. Jeśli dołożę warunek z EID do warunku joina, to też to nic nie zmienia.
Czemu tak się dzieje i jak to zmienić, żeby w pierwszym kroku już były odpowiednio okrojone dane?