2012-05-21 24 views
5

Tengo 4 uniones externas completas en mi consulta y es realmente lenta, ¿el orden de FULL OUTER JOIN hace una diferencia en el rendimiento/resultado?Servidor SQL: ¿importa el orden de las uniones externas completas?

combinación externa completa = ⋈

Entonces,

Tengo una situación: Un ⋈ B ⋈ C ⋈ D

Todas las combinaciones se producen en una clave común a todos k contenida en todas A, B, C, D

Entonces:

  • ¿Cambiar el orden de las ⋈ uniones hará una diferencia en el rendimiento?
  • ¿Cambiar el orden de ⋈ cambia el resultado?

Creo que no debería afectar el resultado, pero ¿afectará el rendimiento o no, no estoy seguro?

Actualización:

Will SQL Server volverá a asignar automáticamente los puntos de unión para un mejor rendimiento suponiendo que el conjunto de resultados será independiente de la orden?

+1

El resultado debe ser el mismo. Es bastante fácil verificar el rendimiento. Compare el tiempo que toma cuando ordena las tablas de pocas a muchas visitas en el orden inverso. –

+0

¿Por qué no intentarlo? Mira los planes de ejecución y los rastreos de SQL Profiler para los diferentes combos. – EBarr

+0

Cuando dices diferente orden quieres decir: '(un FULL JOIN b) FULL JOIN c' vs' un FULL JOIN (b FULL JOIN c) 'por ejemplo? –

Respuesta

8

No, la reorganización de las órdenes JOIN no debería afectar el rendimiento. MSSQL (como con otros DBMS) tiene un query optimizer cuyo trabajo es encontrar el plan de consulta más eficiente para cualquier consulta dada. En general, hacen un trabajo bastante bueno, por lo que es poco probable que venza al optimizador fácilmente.

Dicho esto, lo hacen mal ocasionalmente. Ahí es donde entra en juego el reading an execution plan. Puede agregar JOIN hints para decirle a MSSQL cómo unir sus tablas (en ese punto, ordenar hace asunto). Por lo general, ordena de la tabla más pequeña a la más grande (sin embargo, con un FULL JOIN, no es probable que importe mucho) y sigue el rules of thumb para tipos de combinación.

Dado que está haciendo FULL JOINS, básicamente está leyendo la totalidad de 4 tablas sin disco. Es probable que sea muy caro. Es posible que desee volver a examinar el problema y ver si se puede lograr de una manera diferente.

+1

+1: Para el OP: es importante tener en cuenta que SQL no se ejecuta de forma nativa e ingenua. En realidad, es solo una expresión algo algorítmica para decirle al optimizador la descripción funcional de su problema. El optimizador luego lo compila efectivamente y ejecuta un plan que puede considerarse casi completamente independiente de SQL. – MatBailie

0

Cambiar el orden de una unión externa completa no debe afectar el rendimiento o los resultados. Lo único que se verá afectado según el orden de una unión externa completa es el orden predeterminado de las columnas producidas si se utiliza un SELECT *. Puede estar teniendo problemas de rendimiento simplemente por tratar de hacer múltiples combinaciones con tablas grandes. Si no existe una cláusula where para limitar las tablas, podría estar pasando por cientos de miles de resultados.

3
  • ¿Cambiar el orden de ⋈ cambia el resultado?

No, el orden del FULL JOIN no importa, el resultado será el mismo. Nótese sin embargo, que no se puede usar algo como esto (lo siguiente puede dar resultados diferentes dependiendo del orden de combinaciones):

SELECT 
    COALESCE(a.id, b.id, c.id, d.id) AS id, --- Key columns used in FULL JOIN 
    a.*, b.*, c.*, d.*      --- other columns     
FROM a 
    FULL JOIN b 
     ON b.id = a.id 
    FULL JOIN c 
     ON c.id = a.id 
    FULL JOIN d 
     ON d.id = a.id ; 

Usted tiene que usar algo como esto (ninguna diferencia en los resultados de cualquiera que sea el orden de une):

SELECT 
    COALESCE(a.id, b.id, c.id, d.id) AS id, 
    a.*, b.*, c.*, d.*         
FROM a 
    FULL JOIN b 
     ON b.id = a.id 
    FULL JOIN c 
     ON c.id = COALESCE(a.id, b.id) 
    FULL JOIN d 
     ON d.id = COALESCE(a.id, b.id, c.id) ; 

  • ¿Cambiar el orden de las ⋈ uniones hará una diferencia en el rendimiento?

Teniendo en cuenta que la segunda y tercera se une tiene que ser hecho en el COALESCE() de las columnas y no las propias columnas, sólo pienso probar con grandes mesas suficientes mostrará si los índices pueden ser utilizados con eficacia.

+0

No tengo ninguna situación de fusión. ¡Además, mira la actualización en la pregunta! –

+0

@Yugal: ¿Qué quieres decir con eso? ¿Puedes publicar 2 versiones de tu consulta para que entendamos a qué te refieres? ¿Cómo te estás uniendo si no usas 'COALESCE()'? –

+0

Hm .. algo así como '(A ⋈ B en A.sp = B.sp) ⋈ C en A.sp = C.sp' y así sucesivamente .. –

Cuestiones relacionadas