Il collegamento di Joe è un buon punto di partenza. Quassnoi copre anche questo.
In generale, se i tuoi campi sono correttamente indicizzati OPPURE se prevedi di filtrare più record (ad esempio, hai molte righe EXIST
nella sottoquery) NOT EXISTS
funzionerà meglio.
EXISTS
e NOT EXISTS
entrambi vanno in cortocircuito:non appena un record soddisfa i criteri, viene incluso o filtrato e l'ottimizzatore passa al record successivo.
LEFT JOIN
si unirà a TUTTI I RECORD indipendentemente dal fatto che corrispondano o meno, quindi filtra tutti i record non corrispondenti. Se le tue tabelle sono grandi e/o hai più JOIN
criteri, questo può essere molto molto dispendioso in termini di risorse.
Normalmente provo a usare NOT EXISTS
e EXISTS
dove possibile. Per SQL Server, IN
e NOT IN
sono semanticamente equivalenti e possono essere più facili da scrivere. Questi sono tra gli unici operatori che troverai in SQL Server a cui è garantito il cortocircuito.