No hay forma de que alguien pueda decirte eso EXCEPT
siempre o nunca superará a un OUTER JOIN
equivalente . El optimizador elegirá un plan de ejecución apropiado independientemente de cómo escriba su intención.
Dicho esto, aquí está mi guía:
Usa EXCEPT
cuando al menos uno de lo siguiente es cierto:
- La consulta es más legible (esto casi siempre será cierto).
- Se mejora el rendimiento.
Y AMBOS de los siguientes son verdaderos:
- La consulta produce resultados semánticamente idénticos y puede demostrarlo mediante suficientes pruebas de regresión, incluidos todos los casos extremos.
- El rendimiento no se degrada (nuevamente, en todos los casos extremos, así como los cambios ambientales, como borrar el grupo de búfer, actualizar estadísticas, borrar el caché del plan y reiniciar el servicio).
Es importante tener en cuenta que puede ser un desafío escribir un equivalente EXCEPT
consulta como JOIN
se vuelve más complejo y/o depende de duplicados en parte de las columnas pero no en otras. Escribiendo un NOT EXISTS
equivalente, aunque un poco menos legible que EXCEPT
debería ser mucho más trivial de lograr, y a menudo conducirá a un mejor plan (pero tenga en cuenta que nunca diría ALWAYS
o NEVER
, excepto en la forma en que lo acabo de hacer).
En esta publicación de blog, demuestro al menos un caso en el que EXCEPT
es superado tanto por un LEFT OUTER JOIN
correctamente construido y por supuesto por un equivalente NOT EXISTS
variación.