sql >> Base de Datos >  >> RDS >> Sqlserver

EXCEPT se ejecuta más rápido que JOIN cuando las columnas de la tabla son las mismas

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:

  1. La consulta es más legible (esto casi siempre será cierto).
  2. Se mejora el rendimiento.

Y AMBOS de los siguientes son verdaderos:

  1. La consulta produce resultados semánticamente idénticos y puede demostrarlo mediante suficientes pruebas de regresión, incluidos todos los casos extremos.
  2. 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.