2009-01-07 8 views

Respuesta

78

Comprobar este artículo:

A Visual Explanation of SQL Joins

combinación interna:

combinación externa izquierda:

externa derecha de Ingreso:

+0

La parte 2 de la pregunta era sobre el rendimiento que no está necesariamente relacionado directamente con el método de unión, ¿usted tuvo algún otro comentario al respecto? –

+0

¡Asegúrese de leer todos los comentarios en el artículo porque su presentación de combinaciones como operaciones de conjunto es altamente criticable! Por ejemplo, una combinación de la izquierda NO es una intersección, ya que crea nuevas tuplas. – bortzmeyer

+0

El diagrama sería mejor si también mostrara FULL OUTER JOIN. Dado que los diferentes tipos de uniones producen resultados diferentes, la pregunta sobre el rendimiento es algo irrelevante. Debe elegir el que produce los resultados requeridos. El rendimiento depende del interno del DBMS. –

0

Esperemos que entender el desarrollo. En cuanto a rendimiento, son equivalentes, no hay diferencia.

EDITAR: Oops. Supongo que no te importó esa parte de la respuesta.

+0

Parece ser que sí. – bart

3

A LEFT JOIN B es lo mismo que B RIGHT JOIN A. Algunos RDBMS no tienen RIGHT JOIN, por lo que tiene que volver a escribir la lógica de RIGHT JOIN a LEFT JOIN lógica

A 1 2 3 
B 2 3 4 3 

SELECT A.I FROM INNER JOIN B ON B.I = A.I; 

output: 2 3, 3 

SELECT A.I AS X, B.I AS Y FROM A LEFT JOIN B ON B.I = A.I; 

read above code as A on LEFT, JOINs B 

output: 

X Y 
1 NULL 
2 2 
3 3 
3 3 

SELECT A.I AS X, B.I AS Y FROM B RIGHT JOIN A ON A.I = B.I; 

Leer el código anterior como B on RIGHT, JOINs A. Que es lo mismo que A está en IZQUIERDA

Todo lo que está a la izquierda, siempre se evalúa, siempre tiene una salida. Se puede imaginar un LEFT JOIN B, B RIGHT JOIN A como:

 var result = new Dictionary<int, int?>(); 

     var A = new int[] { 1, 2, 3 }; 
     var B = new int[] { 2, 3, 4, 3 }; 

     foreach (int aElem in A) 
     { 


      bool hasMatch = false; 
      foreach (int bElem in B) 
      { 
       if (bElem == aElem) 
       { 
        result.Add(aElem, bElem); 
        hasMatch = true; 
       } 
      } 

      if (!hasMatch) 
       result.Add(aElem, null); 
     } 



     foreach(int X in result.Keys) 
     { 
      MessageBox.Show(string.Format("X {0} Y {1}", X, result[X].HasValue ? result[X].Value.ToString() : "NULL" )); 
     } 
4

comparaciones de rendimiento entre los tipos de combinaciones son irrelevantes, ya que dan resultados conjuntos diferentes personas. Incluso si una unión interna es más rápida, no la usaría si necesitara los resultados de una combinación izquierda (que incluye incluso los registros que no coinciden con la segunda tabla en la combinación).

3

Izquierda, derecha, interior y exterior no afectan el rendimiento, y ya se han explicado bien aquí.

Sin embargo, hay sugerencias que puede agregar a las combinaciones que afectan al rendimiento: hash, loop y merge.

Normalmente, el planificador de consultas decide cuál de estos debe hacer, pero ocasionalmente puede mejorar el rendimiento anulándolo.

A loopjoin pasa a través de cada fila de la segunda tabla para cada fila de la primera. Esto es bueno si tienes una mesa muy grande y una mucho más pequeña.

A mergejoin pasa juntas por las dos tablas en orden. Puede ser muy rápido si ambas tablas ya están ordenadas por el campo al que se está uniendo.

A hashjoin usa muchas tablas temporales para agrupar la salida a medida que ordena a través de los datos unidos.

Algunos DB especializados también son compatibles con otros tipos, como combinaciones de mapa de bits.

Cuestiones relacionadas