Plan wyjaśnień
pokazałby ci, dlaczego dokładnie powinieneś użyć Exists
. Zwykle pytanie brzmi Istnieje vs. Count(*)
. Istnieje
jest szybszy. Dlaczego?
-
W odniesieniu do wyzwań obecnych przez NULL:gdy podzapytanie zwraca
Null
, dla IN całe zapytanie staje sięNull
. Więc musisz sobie z tym poradzić. Ale używającExist
, to tylkofałsz
. Dużo łatwiej sobie poradzić. Po prostuIN
nie można niczego porównać zNull
aleIstnieje
może. -
np.
Istnieje (wybierz * ze swojej tabeli, gdzie bla ='blabla');
Prawda/fałsz otrzymujesz w momencie znalezienia/dopasowania jednego trafienia . -
W tym przypadku
IN
rodzaj zajmuje pozycjęCount(*)
aby wybrać WSZYSTKIE pasujące wiersze na podstawieGDZIE
ponieważ porównuje wszystkie wartości.
Ale nie zapomnij też o tym:
ISTNIEJE
wykonuje z dużą szybkością naIN
:gdy wyniki podzapytania są bardzo duże.W
wyprzedzaEXISTS
:gdy wynik podzapytania jest bardzo mały.
Więcej informacji na ten temat: