Cześć, mam 2 zapytania. Jedno z distinctem, drugie - z podzapytaniem i group by.
Na samym początku mi wyszło, że to z distinctem zabiera sekundę, a planie wykonania są jakieś prawe złączenia, generalnie podejrzewam, że chodzi o porównywanie rekordów - szukanie duplikatów.
Potem zapuściłem drugie zapytanie. Oczywiście plan egzekucyjny zmalał, ale gdy wywołuję pierwsze zapytanie(to z DISTINCT) dokładnie dostaję rezultat tego drugiego. Tzn. podejrzewam, że SQL sobie coś tam przechowuje i nie wykonuje drugi raz zapytania, którego ma wyniki. Ale próbowałem zmieniać dane w warunkach i wykonywać inne selecty - nic mi to nie zmieniło.
Więc pytanie do speców, które zapytanie wykona się szybciej:
select distinct employeeID, [dbo].get_date(date) as date
FROM V_Events
WHERE (@zm is null or @zm = employeeID) AND
(@zm2 is null or @zm2<=[dbo].get_date(date)) AND
(@zm3 is null or @zm3>=[dbo].get_date(date))
order by employeeID, date
czy
select a.employeeID, a.date
from
(
select employeeID, [dbo].get_date(date) as date
FROM V_Events
where (@zm is null or @zm = employeeID) AND
(@zm2 is null or @zm2<=[dbo].get_date(date)) AND
(@zm3 is null or @zm3>=[dbo].get_date(date))
) as a
group by a.employeeID, a.date
order by a.employeeID, a.date
V_Events to oczywiście widok, który ma w sobie kilka joinów i zagnieżdżonego case'a(ale to chyba w pytaniu akurat nie jest ważne).
get_date to moja funkcja, która wiadomo co robi :)
OK, więc która wersja będzie szybsza?
Aha, w drugim zapytaniu zagnieżdżony select jest dlatego, że bez niego dostawałem duplikaty.