Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Prestazioni SQL su LEFT OUTER JOIN vs NOT EXISTS

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.