Zobaczmy na proste zapytanie z IN:
SELECT [lista_kolumn] FROM [table1] WHERE [column1] IN (SELECT [column2] FROM [table2])
oraz to samo z użyciem EXIST
SELECT [lista_kolumn] FROM [table1] WHERE EXIST (SELECT 1 FROM [table2] WHERE [table1].[column1] = [table2].[column2])
Przetwarzanie klauzuli z IN będzie mieć postać:
- Przetworzenie zapytania wewnętrznego
- Rezultat zapytania zewnętrznego zostanie obcięty o powtarzające się rekordy oraz zostanie nałożony indeks
- Rezultat powyższych operacji zostanie złączony (JOIN) z tabelą zewnętrzną
- Dla każdej wartości w tabeli pierwszej (table1) znajdź pasującą wartość w tabeli drugiej (table2)
- Jeżeli znaleziono wartość, pobierz ją i przejdź do kolejnego rekordu.
W przypadku kiedy tabela pierwsza (table1) jest mała, a tabela druga (table2) jest duża skorzystamy z EXIST. Dlaczego? Jeżeli na kolumnie [table2].[column2] będzie nałożony indeks operacja: WHERE [table1].[column1] = [table2].[column2] wykonuje się bardzo szybko.
W przypadku kiedy tabela1 będzie dużych rozmiarów, a wynik wewnętrznego zapytania mały (table2) warto zastosować klauzulę IN.
Jeżeli wyniki obu zapytań (wewnętrznego i zewnętrznego) będą dużych rozmiarów, zarówno IN jak i EXIST będą mieć podobną wydajność.
Podsumowując:
- zapytanie zewnętrzne zwraca mało wyników, wewnętrzne dużo EXIST
- zapytanie zewnętrzne dużo wyników, wewnętrzne mało IN
- oba zapytania zwracają dużą ilość rekordów - nie ma znaczenia (warto zbadać wtedy plan zapytania aby rozstrzygnąć ostateczne rozwiązanie)
Brak komentarzy:
Prześlij komentarz