niedziela, 1 kwietnia 2012

IN vs EXIST

Czym różni się IN od EXIST? Kiedy zastosować IN a kiedy EXIST?

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ą
Przetwarzanie w przypadku EXIST:
  • 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.
Kiedy więc użyć IN a kiedy EXIST?
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