Entre algunos desarrolladores de SQL Server, es una creencia generalizada que NOT IN
es terriblemente lenta , y las consultas deben reescribirse para que devuelvan el mismo resultado pero no utilicen las palabras clave "malvadas". ( ejemplo )
¿Hay algo de cierto en eso?
¿Existe, por ejemplo, algún error conocido en SQL Server (¿qué versión?) Que hace que las consultas NOT IN
tengan un plan de ejecución peor que una consulta equivalente que use
- un
LEFT JOIN
combinado con unNULL
cheque o (SELECT COUNT(*) ...) = 0
en laWHERE
clausula?
sql-server
query-performance
except
Heinzi
fuente
fuente
IN
/NOT IN
siempre se implementará con bucles anidados. Y no tengo idea de lo questops SQL Server from creating a ‘plan’
se supone que significa.Respuestas:
No creo que tenga nada que ver con ser terriblemente lento; tiene que ver con ser potencialmente inexacto. Por ejemplo, dados los siguientes datos: pedidos que pueden ser realizados por un cliente individual o un socio B2B:
Digamos que quiero encontrar a todos los clientes que nunca han realizado un pedido. Dados los datos, solo hay uno: cliente # 2. Aquí hay tres formas en que podría escribir una consulta para encontrar esa información (hay otras):
Resultados:
Ahora, también hay algunos problemas de rendimiento, y hablo de ellos en esta publicación de blog . Dependiendo de los datos e índices,
NOT EXISTS
generalmente tendrá un rendimiento superiorNOT IN
, y no sé si alguna vez podría funcionar peor. También debe tener en cuenta queEXCEPT
puede introducir una operación de clasificación distinta, por lo que puede terminar con datos diferentes (nuevamente, dependiendo de la fuente). Y que elLEFT OUTER JOIN ... WHERE right.column IS NULL
patrón popular es siempre el de peor desempeño.Martin Smith también tiene mucha buena información de respaldo en su respuesta sobre SO .
fuente