¿Hay alguna diferencia (rendimiento, mejores prácticas, etc.) entre poner una condición en la cláusula JOIN frente a la cláusula WHERE?
Por ejemplo...
-- Condition in JOIN
SELECT *
FROM dbo.Customers AS CUS
INNER JOIN dbo.Orders AS ORD
ON CUS.CustomerID = ORD.CustomerID
AND CUS.FirstName = 'John'
-- Condition in WHERE
SELECT *
FROM dbo.Customers AS CUS
INNER JOIN dbo.Orders AS ORD
ON CUS.CustomerID = ORD.CustomerID
WHERE CUS.FirstName = 'John'
¿Cuál prefieres (y quizás por qué)?
sql
performance
Steve Dignan
fuente
fuente
FROM Orders JOIN OrderParties ON Orders.Id = OrderParties.Order AND OrderParties.Type = 'Recipient' WHERE Orders.Status = 'Canceled'
Respuestas:
El álgebra relacional permite la intercambiabilidad de los predicados en la
WHERE
cláusula yINNER JOIN
, por lo tanto, incluso lasINNER JOIN
consultas conWHERE
cláusulas pueden hacer que el optimizador reorganice los predicados para que puedan ser excluidos durante elJOIN
proceso.Le recomiendo que escriba las consultas de la manera más legible posible.
A veces, esto incluye hacer lo
INNER JOIN
relativamente "incompleto" y poner algunos de los criteriosWHERE
simplemente para hacer que las listas de criterios de filtrado sean más fáciles de mantener.Por ejemplo, en lugar de:
Escribir:
Pero depende, por supuesto.
fuente
Para las uniones internas, realmente no he notado una diferencia (pero como con todos los ajustes de rendimiento, debe verificar su base de datos bajo sus condiciones).
Sin embargo, donde coloca la condición hace una gran diferencia si está utilizando uniones izquierdas o derechas. Por ejemplo, considere estas dos consultas:
El primero le dará solo aquellos registros que tengan un pedido con fecha posterior al 15 de mayo de 2009, lo que convierte la unión izquierda en una unión interna.
El segundo dará esos registros más cualquier cliente sin pedidos. El conjunto de resultados es muy diferente dependiendo de dónde coloque la condición. (Seleccionar * es solo para fines de ejemplo, por supuesto, no debe usar esto en el código de producción).
La excepción a esto es cuando desea ver solo los registros en una tabla pero no en la otra. Luego usa la cláusula where para la condición, no la unión.
fuente
A left join B
es cada fila de A unida a cada fila coincidente de B. Si B no tiene una fila que coincida, entonces las columnas A tienen un valor pero cada columna de B en esa fila se muestra como valores NULL. Si ha escrito,where B.somecolumn = ‘somevalue’
entonces tiene un NULL (B.somecolumn) comparado con 'somevalue'. Cualquier cosa comparada con NULL es falsa, por lo que todas sus filas donde no hay una fila B coincidente para la fila A, se eliminan, y los resultados que obtiene son los mismos que daría una UNIÓN INTERNA, por lo tanto, la unión externa se ha convertido en una interna.funds
la unión interna prospectos en (prospects.id = funds.lead_id y prospects.is_manual = 'no') y SELECCIONAR fondos.id, prospects.id DEfunds
izquierda unirse a prospectos en (prospects.id = funds.lead_id) donde prospects.is_manual = 'no'La mayoría de los productos RDBMS optimizarán ambas consultas de manera idéntica. En "SQL Performance Tuning" de Peter Gulutzan y Trudy Pelzer, probaron varias marcas de RDBMS y no encontraron diferencias de rendimiento.
Prefiero mantener las condiciones de unión separadas de las condiciones de restricción de consulta.
Si está utilizando a
OUTER JOIN
veces es necesario poner condiciones en la cláusula de unión.fuente
DONDE se filtrará después de que se haya producido la UNIÓN.
Filtre en JOIN para evitar que se agreguen filas durante el proceso de JOIN.
fuente
ON
Prefiero JOIN para unir tablas / vistas completas y luego usar WHERE para presentar el predicado del conjunto resultante.
Se siente sintácticamente más limpio.
fuente
Normalmente veo un aumento en el rendimiento al filtrar en la unión. Especialmente si puede unirse en columnas indexadas para ambas tablas. Debería poder reducir las lecturas lógicas con la mayoría de las consultas haciendo esto también, que es, en un entorno de alto volumen, un indicador de rendimiento mucho mejor que el tiempo de ejecución.
Siempre me divierte un poco cuando alguien muestra su evaluación comparativa de SQL y ha ejecutado ambas versiones de un sproc 50,000 veces a la medianoche en el servidor de desarrollo y compara los tiempos promedio.
fuente
Poner la condición en la combinación me parece "semánticamente incorrecto", ya que no es para eso que están "unidas". Pero eso es muy cualitativo.
Problema adicional: si decide cambiar de una unión interna a, por ejemplo, una unión correcta, tener la condición dentro de la UNIÓN podría generar resultados inesperados.
fuente
Las uniones son más rápidas en mi opinión cuando tienes una mesa más grande. Realmente no es una gran diferencia, especialmente si se trata de una mesa más pequeña. Cuando supe por primera vez sobre las combinaciones, me dijeron que las condiciones en las combinaciones son como las condiciones de la cláusula where y que podría usarlas indistintamente si la cláusula where fuera específica sobre qué tabla hacer la condición.
fuente
Es mejor agregar la condición en la Unión. El rendimiento es más importante que la legibilidad. Para grandes conjuntos de datos, es importante.
fuente