sql - outer - left join right join join
ÚNASE A LA IZQUIERDA INTERNA IZQUIERDA A LA IZQUIERDA EXTERNA-¿Por qué demora más la EXTERNA? (4)
Tenemos la consulta a continuación. El uso de una combinación IZQUIERDA EXTERNA toma 9 segundos para ejecutarse. Cambiar el EXTERNO IZQUIERDO a un INTERIOR IZQUIERDO reduce el tiempo de ejecución a 2 segundos y se devuelve el mismo número de filas. Dado que se está procesando el mismo número de filas de la tabla dbo.Accepts, independientemente del tipo de unión, ¿por qué el externo tardaría 3 veces más?
SELECT CONVERT(varchar, a.ReadTime, 101) as ReadDate,
a.SubID,
a.PlantID,
a.Unit as UnitID,
a.SubAssembly,
m.Lot
FROM dbo.Accepts a WITH (NOLOCK)
LEFT OUTER Join dbo.Marker m WITH (NOLOCK) ON m.SubID = a.SubID
WHERE a.LastModifiedTime BETWEEN @LastModifiedTimeStart AND @LastModifiedTimeEnd
AND a.SubAssembly = ''400''
1) en una ventana de consulta en SQL Server Management Studio, ejecute el comando:
SET SHOWPLAN_ALL ON
2) ejecute su consulta lenta
3) su consulta no se ejecutará, pero se devolverá el plan de ejecución. almacenar esta salida
4) ejecute su versión rápida de la consulta
5) su consulta no se ejecutará, pero se devolverá el plan de ejecución. almacenar esta salida
6) compare la salida de la versión de consulta lenta con la salida de la versión de consulta rápida.
7) si aún no sabe por qué uno es más lento, publique ambos resultados en su pregunta (edítelo) y alguien aquí puede ayudar desde allí.
El hecho de que se devuelva el mismo número de filas es un hecho posterior, el optimizador de consultas no puede saber de antemano que cada fila en Aceptar tiene una fila coincidente en Marcador, ¿verdad?
Si une dos tablas A y B, digamos que A tiene 1 millón de filas y B tiene 1 fila. Si dice A AJUSTE INTERIOR IZQUIERDO B, significa que solo se pueden generar filas que coincidan con A y B, por lo que el plan de consulta es libre de escanear B primero, luego usar un índice para hacer un escaneo de rango en A, y tal vez devolver 10 filas. Pero si dice A UNO EXTREMO IZQUIERDO B, entonces al menos todas las filas en A deben devolverse, por lo que el plan debe escanear todo en A sin importar lo que encuentre en B. Al usar un enlace EXTERIOR, está eliminando una posible optimización.
Si sabe que cada fila en Accepts tendrá una coincidencia en Marker, ¿por qué no declarar una clave externa para hacer cumplir esto? El optimizador verá la restricción y, si es de confianza, la tendrá en cuenta en el plan.
Espere, ¿realmente quiso decir que "se está procesando el mismo número de filas ... o que" se está devolviendo el mismo número de filas "? En general, la unión externa procesaría muchas más filas, incluidas aquellas para las que no hay coincidencia, incluso si devuelve el mismo número de registros.
Esto se debe a que la UNIÓN EXTERNA IZQUIERDA está haciendo más trabajo que una UNIÓN INTERNA ANTES de devolver los resultados.
La unión interna busca todos los registros en los que la instrucción ON es verdadera (de modo que cuando crea una nueva tabla, solo coloca registros que coinciden con m.SubID = a.SubID). Luego compara esos resultados con su declaración WHERE (Su última hora de modificación).
La combinación externa izquierda ... Toma todos los registros en su primera tabla. Si la declaración ON no es verdadera (m.SubID no es igual a a.SubID), simplemente NULLS los valores en la columna de la segunda tabla para ese conjunto de registros.
La razón por la que obtiene la misma cantidad de resultados al final es probablemente una coincidencia debida a la cláusula WHERE que ocurre DESPUÉS de todas las copias de los registros.