sobota, 15 września 2012

Optymalizacja operacji JOIN

Zobaczmy na prosty przykład:

Naszym zadaniem jest przedstawienie ile kół posiada każdy z pojazdów.
Standardowo napiszemy następujące zapytanie:


SELECT p.Nazwa, COUNT(1) AS 'Ilosc kól'
FROM Pojazd p JOIN Kolo k ON p.Id = k.IdPojazd
GROUP BY p.Nazwa 


Zapytanie jest poprawne, jednak ma ono jedną wadę. W przypadku kiedy w tabelach będzie przybywało danych zapytanie będzie stawało się coraz wolniejsze.
Analizując zapytanie możemy dojść do wniosku że główne obciążenie stanowi połączenie dwóch tabel.
Zapytanie to można podzielić na dwa zliczając najpierw w drugiej tabeli koła dla samochodów a następnie łącząc z pierwszą tabelą:

Jeżeli w pierwszej tabeli jest 2 mln rekordów a w drugiej np 10 mln połączenie spowoduje grupowanie 10 mln rekordów. Łatwiej najpierw pogrupować 2 tabelę i połączyć ją z pojazdami niż na odwrót:

SELECT p.Nazwa, k.IloscFROM Pojazd p JOIN (SELECT IdPojazd, COUNT(1) 'Ilosc' FROM Kolo GROUP BY IdPojazd) AS k ON p.Id = k.IdPojazd

Takie zapytanie wykona się w dużo krótszym czasie oraz zużyje znacznie mniej zasobów sprzętowych.

Brak komentarzy:

Prześlij komentarz