2009-06-15 9 views
7

Tengo dos tablas:¿El filtrado o la unión suceden primero en T-SQL?

Customers(Id, Name, TownId) T 
Towns(Id, Name) 

tengo una instrucción SQL como esto:

SELECT * 
FROM Customers 
INNER JOIN Towns ON Towns.Id = Customers.TownId 
WHERE Customers.Id > 5 

¿Qué pasaría en primer lugar?
¿Filtraría la tabla Customers y luego uniría los registros seleccionados con la tabla Towns?
¿Uniría todos Customers con Towns y luego filtrar? ¿O es que no puedes decirlo?

Respuesta

15

El optimizador hará lo que crea que será más rápido.

Puede forzar ciertos comportamientos con sugerencias de combinación o fomentar ciertos comportamientos con estadísticas e índices. Sin embargo, generalmente es mejor confiar en el Optimizador.

Si desea una explicación detallada de cómo se ejecuta una consulta, consulte el execution plan.

+3

Las técnicas comunes para "forzar" un QEP en particular dependen casi por completo del proveedor ... logrando de manera efectiva el bloqueo del proveedor. Cuidado con esa hacha Eugenio. – corlettk

+0

+1 para Pink Floyd. :-) – GuyBehindtheGuy

0

En términos simples, el filtro ocurrirá antes de la unión, por lo que no se unirá a la totalidad de ambas tablas antes de filtrar.

Dependiendo del conjunto de herramientas que esté utilizando, debe encontrar una opción para mostrar el plan de ejecución de la consulta, que le ayudará a ver el orden de ejecución y el costo de cada etapa.

1

Hablando en general, la unión ocurre primero. Considere:

 
t1.id t1.foo  t2.id t2.bar t2.t1_id 
-------------  ------------------------ 
    1 'abc'   1 '123'   1 
    2 'def'   2 '456'   1 
    3 'ghi'   3 '789'   2 
    4 'jkl'   4 '0'  NULL 

Esta consulta:

SELECT 
    t1.foo, 
    t2.bar 
FROM 
    t1 
    LEFT JOIN t2 ON t1.id = t2.t1_id 
WHERE 
    t2.somevalue IS NOT NULL 

producirá:

 
foo  bar 
------------- 
'abc' '123' 
'abc' '456' 
'def' '789' 

mientras que, cuando se tire el filtro en la condición de unión, filtrado pasa en el, así unirse a:

SELECT 
    t1.foo, 
    t2.bar 
FROM 
    t1 
    LEFT JOIN t2 ON t1.id = t2.t1_id AND t2.somevalue IS NOT NULL 

dará un resultado:

 
foo  bar 
------------- 
'abc' '123' 
'abc' '456' 
'def' '789' 
'ghi' NULL 
'jkl' NULL 

Cuanto más compleja sea la consulta obtiene, menos fácil que es decir, que los registros son filtradas por el plan de ejecución antes de que se unieron a las tablas y que después de eso.

+0

no es exactamente la respuesta a mi pregunta. En MI ejemplo, ¿puede garantizar que la unión siempre suceda primero? – agnieszka

+0

En * su * ejemplo, no hace ninguna diferencia, porque usa una unión interna. Filtra primero: únete más tarde o al revés, no habrá un conjunto de resultados diferente sin importar lo que hagas. Los casos extremos están con las uniones externas. – Tomalak

+0

no hace ninguna diferencia en el resultado, pero hace la diferencia en la eficiencia.de todos modos, no importa, solo quiero saber qué pasa primero, incluso si los resultados devueltos son los mismos – agnieszka

0

Cuando la consulta se ejerce como una combinación de combinación, el filtrado y la unión se producen simultáneamente.

Cuestiones relacionadas