Tengo una consulta básica que va de 6 segundos a 1 segundo simplemente cambiando una combinación de LEFT JOIN
a LEFT HASH JOIN
o 'LEFT LOOP JOIN'. ¿Alguien puede explicar por qué esto causaría un aumento tan grande en el rendimiento y por qué el optimizador de SQL no lo está resolviendo por sí mismo?¿Por qué 'HASH JOIN' o 'LOOP JOIN' mejoran este proceso almacenado?
Aquí es más o menos lo que se ve como el SQL:
SELECT
a.[ID]
FROM
[TableA] a
LEFT HASH JOIN
[TableB] b
ON b.[ID] = a.[TableB_ID]
JOIN
[TableC] c
ON c.[ID] = a.[TableC_ID]
WHERE
a.[SomeDate] IS NULL AND
a.[SomeStatus] IN ('X', 'Y', 'Z') AND
c.[SomethingElse] = 'ABC'
la Tabla A y B tienen millones de registros e índices en todos los campos de ID. Uso de SQL Server 2005.
Editar: Un colega sugirió una combinación de bucle IZQUIERDA y parece haber hecho que sea aún más rápido ... SQL no es uno de mis puntos fuertes, así que estoy tratando de entender cómo estos 'consejos' Están ayudando.
¿Podría publicar el plan antes de aplicar la sugerencia y después de eso? Solo emita 'SET SHOWPLAN_TEXT ON GO SELECT ...' – Quassnoi
Elimine todas las sugerencias y luego ejecute la consulta en SSMS con show real plan, luego en el plan compare el recuento de filas estimadas con el recuento de filas reales para los operadores de escaneo/búsqueda en los bordes de la plan. El plan se genera en función del recuento * estimado *, la duración está determinada por el recuento * real *. Las discrepancias indican malas estadísticas, pero también pueden ocurrir con buenas estadísticas para valores inusuales e impares (es decir, el único SomeStatus que tiene 1 mil., Filas, no 10). –