Saltar al contenido

El orden lógico del plan de ejecución de la consulta SQL con más de una combinación

Te damos la bienvenida a proyecto online, en este lugar vas a encontrar la respuesta que estás buscando.

Solución:

Una forma de determinar el orden lógico de las combinaciones es reemplazar la primera combinación interna en su ejemplo con una combinación externa izquierda:

SELECT *
FROM user_branch T1
LEFT  JOIN dimcustomer2 T2
   ON T1.BRANCH_CODE = T2.BRANCH_CODE
INNER JOIN customer_guarantee T3
   ON T3.CUSTOMER_NUM = T2.CUSTOMER_NUM

Supongamos que algunas filas en T1 no tengo coincidencias en T2. Más específicamente, supongamos que estas son las tres tablas:

    T1                         T2                           T3
                                                   
BRANCH_CODE          BRANCH_CODE  CUSTOMER_NUM          CUSTOMER_NUM
-----------          -----------  ------------          ------------
11                   11           230                   120
12                   12           235                   170
13                   15           260                   230
14                                                      235
15                                                      245
                                                        250
                                                        260
                                                        270

Hay dos combinaciones aquí y dos posibilidades en el orden en que se ejecutan.

1. LEFT JOIN, luego INNER JOIN

Si la combinación izquierda se evalúa primero, su resultado tendrá nulos en el T2 columnas donde T1 las filas no tenían coincidencia:

T1.BRANCH_CODE  T2.BARNCH_CODE  T2.CUSTOMER_NUM
--------------  --------------  ---------------
11              11              230
12              12              235
13              (null)(null)
14              (null)(null)
15              15              260

Uniendo ese resultado aún más con T3 usando una combinación interna en una condición que usa un T2 columna eliminará las no coincidencias y, por lo tanto, la correspondiente T1 filas, – porque un null no puede satisfacer la condición de igualdad de la combinación:

T1.BRANCH_CODE  T2.BARNCH_CODE  T2.CUSTOMER_NUM  T3.CUSTOMER_NUM
--------------  --------------  ---------------  ---------------
11              11              230              230
12              12              235              235
15              15              260              260

De esta manera algunos de T1 las filas se excluirán del conjunto de resultados final.

2. INNER JOIN, luego LEFT JOIN

Ahora, si la combinación interna se ejecuta primero, producirá un conjunto de resultados que contiene las filas de T2 y T3 que coinciden con la condición de la combinación interna:

T2.BARNCH_CODE  T2.CUSTOMER_NUM  T3.CUSTOMER_NUM
--------------  ---------------  ---------------
11              230              230
12              235              235
15              260              260

Cuando este conjunto de resultados se une externamente a T1, T1 estando en el lado exterior, obtendrá un resultado final que contiene todas las filas de T1 y los del T2T3 combinación interna que coincida con la condición de combinación externa:

T1.BRANCH_CODE  T2.BARNCH_CODE  T2.CUSTOMER_NUM  T3.CUSTOMER_NUM
--------------  --------------  ---------------  ---------------
11              11              230              230
12              12              235              235
13              (null)(null)(null)
14              (null)(null)(null)
15              15              260              260

Por tanto, esta segunda interpretación significaría que todos T1 las filas deben estar presentes en el resultado.


Dado que estas dos interpretaciones dan resultados tan diferentes, está claro que solo una puede ser true. Ejecutando la consulta, verá que en realidad es la primera. Eso significa que Lógicamente, las combinaciones se ejecutan en el orden en que se especifican en el FROM cláusula.

Variaciones de sintaxis

Tenga en cuenta que la conclusión anterior se aplica a la sintaxis de combinación más convencional, a saber:

FROM
  T1
  ... JOIN T2 ON ...
  ... JOIN T3 ON ...
  ...

Su ejemplo coincide con ese patrón, por lo que la conclusión también se aplica a él. Sin embargo, hay variaciones que vale la pena mencionar en las que nuestra conclusión no se aplica, o al menos no de manera tan directa.

1. Sintaxis de JOIN anidada

Sintácticamente, una combinación se puede especificar dentro de otra combinación, así:

FROM
  T1
  JOIN
    T2
    JOIN T3 ON ..
  ON ...

En el caso anterior, JOIN T2 se encuentra antes JOIN T3. Sin embargo, la declaración de la unión anterior no está completa en ese momento: su ON La subcláusula es la que está al final y se evalúa lógicamente solo después de la JOIN T3 ON ... parte. Entonces, en este caso, T2 está unido a T3 primero, luego el resultado de la combinación se une a T1.

usted podría Todavía sostengo que nuestra conclusión se mantiene aquí, aunque no es tan clara en esta situación. Llegamos a la conclusión de que las uniones se evalúan en el orden en que se especificado en el FROM cláusula. En este ejemplo, la primera combinación que encontramos al analizar el FROM cláusula, aún no está completamente especificada para el momento en que lo es la segunda.

2. Mezcla de combinaciones de comas y combinaciones convencionales

Antes de la introducción de lo explícito JOIN sintaxis, las uniones se especificaron así:

FROM
  T1,
  T2,
  T3
WHERE
  

Este tipo de combinación, a veces denominado combinación de coma, todavía es compatible con la mayoría, si no todas, las plataformas, incluido SQL Server.

Sin una condición de combinación, una combinación de coma es esencialmente una combinación cruzada. Una condición de unión la convierte en una unión interna. Sin embargo, puede ver que la condición de unión en este caso viene en una cláusula completamente diferente, la WHERE cláusula.

Ahora, SQL Server le permite mezclar combinaciones de comas y combinaciones convencionales en el mismo FROM cláusula. Cuando tienes una combinación de combinaciones como esta:

FROM
  T1,
  T2
  JOIN T3 ON ... ,
  T4 ...

SQL Server evaluará cada elemento individual separado por comas independientemente de los demás antes de unirlos de forma cruzada. Entonces, en el caso anterior, el T2 JOIN T3 ON ... La unión se evaluará antes de que su resultado se combine de forma cruzada con T1 (para filtrarse aún más por cualquier condición de unión que pueda ser la WHERE cláusula). Nuestra conclusión no se aplica en absoluto aquí. Sin embargo, puede ver que en este caso entra en juego una sintaxis muy diferente.

Estoy discutiendo el mixed sintaxis con un poco más de detalle en mi respuesta sobre Stack Overflow: el identificador de varias partes no se pudo vincular.

Me temo que la frase “ejecución lógica” no tiene mucho sentido; La ejecución de consultas, por definición, es la materialización física de un conjunto de resultados. Creo que lo que quieres decir con “ejecución lógica” es la compilación de la consulta, la fase en la que se analiza la sintaxis de la consulta y el significado semántico y se prepara el plan de consulta para implementar dicho significado semántico.

Mesas unidas1 en una consulta siempre se evalúan de izquierda a derecha (o de arriba a abajo):

select ... from t_a                   -- evaluated first
           join t_b                   -- evaluated second
             on t_a.c1 = t_b.c3
           join t_x                   -- evaluated third
             on t_b.c4 = t_x.c5
           ...

Puede verificar esto usted mismo si intenta hacer referencia en el ON cláusula una columna que pertenece a una tabla incluida más adelante en la secuencia de evaluación. Esto fallará al compilar:

select ... from t_a
           join t_b
             on t_a.c1 = t_c.c8       -- t_c is not known yet
           join t_c                   
           ...

Después de analizar la consulta, el plan de ejecución puede realizar combinaciones en alguna orden que mantiene la semántica de la consulta. Como dice el manual,

El orden de las fuentes de la tabla después del FROM La palabra clave no afecta el conjunto de resultados que se devuelve.

Esta sesión de preguntas y respuestas está algo relacionada.


1 – A joined_table la cláusula consta de dos table_sourcesy sus correspondientes ON cláusula.

Todos los JOIN pertenecen en realidad a la cláusula FROM. Semánticamente, no importa en qué orden se escriben las JOIN, siempre que mantenga las cláusulas ON y no use las cláusulas LEFT / RIGHT OUTER JOIN. Dicho de otra manera, la salida de las cláusulas FROM y JOIN es una única relación grande en la que claramente no importa en qué orden estén las columnas. Esto es muy importante porque es una oportunidad de optimización importante para el optimizador de la base de datos: tiene sentido ejecutar las JOIN entre las relaciones más pequeñas primero si las condiciones WHERE pueden eliminarlo. De esta manera, podría ser más factible para la base de datos almacenar en caché esas columnas mientras trabaja en el resto del conjunto de resultados.

valoraciones y reseñas

Si posees algún titubeo y capacidad de arreglar nuestro post puedes escribir una observación y con placer lo estudiaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *