Pregunta

Tengo una consulta relativamente simple que une dos tablas. El & Quot; Donde & Quot; Los criterios se pueden expresar en los criterios de unión o como una cláusula where. Me pregunto cuál es más eficiente.

La consulta es para encontrar ventas máximas para un vendedor desde el principio hasta que fueron promovidas.

Caso 1

select salesman.salesmanid, max(sales.quantity)
from salesman
inner join sales  on salesman.salesmanid =sales.salesmanid 
                  and sales.salesdate < salesman.promotiondate
group by salesman.salesmanid 

Caso 2

select salesman.salesmanid, max(sales.quantity)
from salesman
inner join sales  on salesman.salesmanid =sales.salesmanid 
where sales.salesdate < salesman.promotiondate
group by salesman.salesmanid 

Nota El caso 1 carece por completo de una cláusula where

RDBMS es SQL Server 2005

EDITAR Si la segunda parte del criterio de unión o la cláusula where era sales.salesdate & Lt; alguna fecha fija, por lo que no hay ningún criterio para unir las dos tablas, eso cambia la respuesta.

¿Fue útil?

Solución

No usaría el rendimiento como factor decisivo aquí, y honestamente, no creo que haya una diferencia de rendimiento medible entre esos dos casos, en realidad.

Siempre usaría el caso # 2, ¿por qué? Porque, en mi opinión, solo debe poner los criterios reales que establecen el JOIN entre las dos tablas en la cláusula JOIN; todo lo demás pertenece a la cláusula WHERE.

Solo es cuestión de mantener las cosas limpias y poner las cosas donde pertenecen, en mi opinión.

Obviamente, hay casos con UNIDADES EXTERIORES IZQUIERDAS en las que la ubicación de los criterios marca la diferencia en términos de los resultados que se devuelven; esos casos quedarían excluidos de mi recomendación, por supuesto.

Marc

Otros consejos

Puede ejecutar el estimador del plan de ejecución y el perfilador sql para ver cómo se comparan entre sí.

Sin embargo, son semánticamente iguales debajo del capó según este MVP de SQL Server:

http://www.eggheadcafe.com/conversation .aspx? messageid = 29145383 & amp; threadid = 29145379

Prefiero tener cualquier criterio codificado en la unión. Hace que el SQL sea mucho más legible y portátil.

Legibilidad: Puede ver exactamente qué datos va a obtener porque todos los criterios de la tabla están escritos allí mismo en la unión. En declaraciones grandes, los criterios pueden estar enterrados dentro de otras 50 expresiones y se pueden pasar por alto fácilmente.

Portabilidad: Puede copiar un fragmento de la cláusula FROM y pegarlo en otro lugar. Eso le da las uniones y cualquier criterio que necesite para acompañarlo. Si siempre usa ese criterio al unir esas dos tablas, entonces ponerlo en la unión es lo más lógico.

Por ejemplo:

FROM
table1 t1
JOIN table2 t2_ABC ON
  t1.c1 = t2_ABC.c1 AND
  t2_ABC.c2 = 'ABC'

Si necesita obtener una segunda columna de la tabla 2, simplemente copie ese bloque en el Bloc de notas, busque / repare " ABC " y listo y todo el nuevo bloque de código listo para pegar nuevamente.

Adicional: También es más fácil cambiar entre una unión interna y externa sin tener que preocuparse por ningún criterio que pueda estar flotando en la cláusula WHERE.

Me reservo la cláusula WHERE estrictamente para los criterios de tiempo de ejecución siempre que sea posible.

En cuanto a eficiencia: Si te refieres a la velocidad de ejecución, entonces, como todos los demás lo han dicho, es redundante. Si se refiere a una depuración y reutilización más fáciles, prefiero la opción 1.

Una cosa que quiero decir finalmente como notifiqué, antes de eso ... Ambas formas pueden ofrecer el mismo rendimiento o utilizar los criterios de la cláusula Where pueden ser un poco más rápidas, como se encuentra en algunas respuestas ...

Pero identifiqué una diferencia, puede usar para sus necesidades lógicas ...

  1. El uso de los criterios en la cláusula ON no filtrará / omitirá las filas para seleccionar en su lugar, las columnas de unión serían nulas según las condiciones

  2. Usando los criterios en la cláusula Donde puede filtrar / omitir las filas en los resultados completos

No creo que encuentre una respuesta finita para esta que se aplique a todos los casos. Los 2 no siempre son intercambiables, ya que para algunas consultas (algunas unidas a la izquierda) obtendrá resultados diferentes al colocar los criterios en la línea WHERE vs FROM.

En su caso, debe evaluar ambas consultas. En SSMS, puede ver los planes de ejecución estimados y reales de ambas consultas; ese sería un buen primer paso para determinar cuál es el más óptimo. También puede ver el tiempo & Amp; IO para cada uno (establecer estadísticas de tiempo activado, establecer estadísticas de io activado), y eso también le dará información para tomar su decisión.

En el caso de las consultas en su pregunta, apuesto a que ambas saldrán con el mismo plan de consulta, por lo que en este caso puede no importar, pero en otros podría producir planes diferentes.

Pruebe esto para ver la diferencia entre los 2 ...

SET STATISTICS IO ON
SET STATISTICS TIME ON

select salesman.salesmanid, 
       max(sales.quantity)
from   salesmaninner join sales on salesman.salesmanid =sales.salesmanid
       and sales.salesdate < salesman.promotiondate
group by salesman.salesmanid

select salesman.salesmanid, 
       max(sales.quantity)
from   salesmaninner join sales on salesman.salesmanid = sales.salesmanid 
where  sales.salesdate < salesman.promotiondate
group by salesman.salesmanid

SET STATISTICS TIME OFF
SET STATISTICS IO OFF

Puede parecer frívolo, pero la respuesta es la consulta para la cual el analizador de consultas produce el plan más eficiente.

En mi opinión, parecen ser equivalentes, por lo que el analizador de consultas puede producir planes idénticos, pero tendrías que probarlo.

Ninguno de los dos es más eficiente, usar el método WHERE se considera la forma antigua de hacerlo ( http://msdn.microsoft.com/en-us/library/ms190014.aspx ). Puedes mirar el plan de ejecución y ver que hacen lo mismo.

¡¡Familiarícese con el plan de ejecución estimado en SQL Management Studio !! Como han dicho otros, estás a merced del analizador, no importa lo que hagas, así que confía en sus estimaciones. Supongo que los dos que proporcionó producirían exactamente el mismo plan.

Si es un intento de cambiar una cultura de desarrollo, elija la que le ofrezca un mejor plan; para los que son idénticos, sigue la cultura

He comentado esto en otras " eficiencia " publicaciones como esta (es a la vez sincera y sarcástica): si aquí es donde residen sus cuellos de botella, entonces choca los cinco con usted y su equipo.

El caso 1 (criterios en JOIN) es mejor para la encapsulación, y una mayor encapsulación suele ser algo bueno: disminución de las omisiones de copiar / pegar en otra consulta, disminución de errores si luego se convierte a LEFT JOIN y mayor legibilidad (cosas relacionadas juntas y menos " ruido " en la cláusula WHERE). En este caso, la cláusula WHERE solo captura los criterios de la tabla principal o los criterios que abarcan varias tablas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top