khan - Diferencias en la combinación de SQL
sequel database (5)
¿Cuál es la diferencia entre la combinación interna y la combinación externa (combinación izquierda, combinación derecha) y cuál tiene el mejor rendimiento de ellos?
¡Gracias!
Espero que entiendas las imágenes. En cuanto a rendimiento, son equivalentes, no hay diferencia.
EDITAR: Oops. Supongo que no te importó esa parte de la respuesta.
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 sí afectan el rendimiento: hash, loop y merge.
Normalmente, el planificador de consultas decide cuál de estos debe hacer, pero de vez en cuando puede mejorar el rendimiento anulándolo.
Una join
loop
pasa por cada fila en la segunda tabla para cada fila en la primera. Esto es bueno si tienes una mesa muy grande y una mucho más pequeña.
Una join
merge
pasa por ambas tablas juntas en orden. Puede ser muy rápido si ambas tablas ya están ordenadas por el campo al que se está uniendo.
Una join
hash
utiliza muchas tablas temporales para agrupar la salida a medida que ordena a través de los datos unidos.
Algunos DB especializados también admiten otros tipos, como las uniones de mapa de bits.
Las comparaciones de rendimiento entre los tipos de combinaciones son irrelevantes, ya que brindan conjuntos de resultados diferentes. 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).
Verifique este artículo:
Una explicación visual de SQL se une
Unir internamente:
Izquierda combinación externa:
Unión exterior derecha:
A LEFT JOIN B
es lo mismo que B RIGHT JOIN A
Algunos RDBMS no tienen RIGHT JOIN
, por lo que debe volver a escribir su lógica RIGHT JOIN
para la lógica LEFT JOIN
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;
Lea el código anterior como B on RIGHT, JOINs A
Que es lo mismo que A está a la IZQUIERDA
Lo que está a la izquierda, siempre se evalúa, siempre tiene una salida. Puedes imaginar A IZQUIERDA UNIRSE B, B DERECHA UNIRSE 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" ));
}