Link Joe jest dobrym punktem wyjścia. Quassnoi również to obejmuje.
Ogólnie czy twoje pola są poprawnie zindeksowane LUB jeśli spodziewasz się odfiltrować więcej rekordów (tj. masz dużo wierszy EXIST
w podzapytaniu) NOT EXISTS
będzie działać lepiej.
EXIST
i NOT EXISTS
oba zwarcie - gdy tylko rekord spełnia kryteria, jest uwzględniany lub odfiltrowywany, a optymalizator przechodzi do następnego rekordu.
LEFT JOIN
dołączy do WSZYSTKICH REKORDÓW niezależnie od tego, czy pasują, czy nie, a następnie odfiltruj wszystkie niepasujące rekordy. Jeśli Twoje tabele są duże i/lub masz wiele JOIN
kryteria, może to być bardzo zasobożerne.
Zwykle próbuję użyć NOT EXISTS
i EXIST
tam, gdzie to możliwe. W przypadku serwera SQL IN
i NOT IN
są semantycznie równoważne i mogą być łatwiejsze do napisania. Są to jedne z jedynych operatorów, jakie można znaleźć w SQL Server, które gwarantują zwarcie.