2010-07-30 12 views
7

whos podría ser mucho más eficiente si uso nestted subquery, JOINs O tal temp tables .. otra pregunta: en subconsultas si yo uso en la cláusula dos veces con la misma consulta se debe ejecutar un doble también!? de esta manera:consulta anidada vs une a

Select ... 
From X 
Where Exists(Select 1 From Y Where Idx = Y.SomeColumn) 
Or Exists(Select 1 From Y Idy = Y.SomeColumn) 

cuántas veces la sub-consulta SELECT * FROM Y podría ser ejecutado en esta consulta!
y lo que si uso esta manera de hacerlo:

With XX As 
(
Select ... 
From Y 
) 
Select ... 
From X 
Where Exists (Select 1 From XX Where Idx = XX.SomeColumn) 
Or Exists (Select 1 From XX Where Idy = XX.SomeColumn) 

Gracias :)

Respuesta

4

Las dos consultas son equivalentes y deben producir planes idénticos. Es una idea errónea de que los CTE se compilan solo una vez, lo que proporciona un beneficio de rendimiento. Los CTE no recursivos son solo azúcares sintácticos para tablas derivadas/vistas en línea (IMO se denomina erróneamente subconsultas).

En segundo lugar, JOINs vs IN/EXISTS puede producir resultados diferentes. JOINs arriesgan datos duplicados, si hay dos o más registros de apoyo. EXISTS se utiliza mejor si hay criterios duplicados, porque devuelve verdadero en el primer encuentro de los criterios, lo que lo hace potencialmente más rápido que IN o JOIN. No hay riesgo de duplicación de datos al usar EXISTS o IN.

+0

muchas gracias hombre :) – Rawhi

0

combinaciones estén mucho más rápido que las otras sugerencias que ha realizado.

Las uniones realizarán la condición de ENCENDIDO para cada registro, mientras que al hacer selecciones con un DÓNDE se extraerán TODOS los registros primero, luego se realizará el filtro, por lo tanto, será mucho más lento.

¡Se une todo el camino!

+0

pero si debería usar distinto con él, no será tan rápido como los demás ... ¿verdad? – Rawhi

+0

@Paul Curses, me ganaste con eso. –

+0

AHA ....... !!!! – Rawhi

2

Utilice el plan de ejecución en SQL Server Management Studio y compruebe usted mismo qué funciona más rápido en su base de datos.

+0

intenté descargarlo, pero fallé ¡hh! – Rawhi

+0

La versión express está disponible y generalmente funciona: http: // www.microsoft.com/downloads/details.aspx?familyid=c243a5ae-4bd1-4e3d-94b8-5a0f62bf7796&displaylang=en –

2

primer lugar, su sintaxis es probablemente incorrect.Thus, los dos formatos se vería así:

Select ... 
From X 
Where Exists(Select 1 From Y Where Idx = Y.SomeColumn) 
    Or Exists(Select 1 From Y Idy = Y.SomeColumn) 

Y

With XX As 
    (
    Select ... 
    From Y 
    ) 
Select ... 
From X 
Where Exists (Select 1 From XX Where Idx = XX.SomeColumn) 
    Or Exists (Select 1 From XX Where Idy = XX.SomeColumn) 

Nota del Exists declaraciones. No son Where Col Exists(... sino que son solo Where Exists(....

En segundo lugar, la eficiencia y la velocidad dependerán de los datos, estadísticas, índices y, a fin de cuentas, de lo que el optimizador pueda hacer más eficiente. Por lo tanto, realmente necesita mirar el plan de ejecución para saber cuál es más rápido. Ahora, otro formulario podría ser:

Select ... 
From X 
Where Exists (
       Select 1 
       From Y 
       Where Idx = Y.SomeColumn 
       Union All 
       Select 1 
       From Y 
       Where Idy = Y.SomeColumn 
       ) 
+0

thanx .......: D – Rawhi