2009-09-08 17 views
7

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.

+0

¿Podría publicar el plan antes de aplicar la sugerencia y después de eso? Solo emita 'SET SHOWPLAN_TEXT ON GO SELECT ...' – Quassnoi

+0

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). –

Respuesta

6

HASH JOIN es útil cuando el gran porcentaje de filas contribuye al resultado.

En su caso, la construcción de un HASH TABLE a ambos A o B y escanear otra mesa es más barato que sea la realización de NESTED LOOPS sobre el índice de B.ID o la fusión de los conjuntos de resultados ordenados, que el optimizador ha utilizado antes de la pista.

SQL Server El optimizador no lo vio: probablemente porque no recopiló estadísticas, probablemente porque su distribución de datos está sesgada.

Actualización:

Ya que menciona que LOOP JOIN mejorado la velocidad, puede ser por lo que el orden JOIN la elección errónea por el optimizador.

+0

En este caso, casi todas las filas deberían unirse correctamente (por ejemplo, 90% +). – Kelsey

+0

fijo s/distibution/distribution. Además: parece que finalmente me pasaste por el total de votos en la página de estadísticas de servidor sql. Admito libremente que tienes más conocimiento sobre el tema, por lo que el mundo ahora está un poco menos desviado. http://stackoverflow.com/questions/tagged?tagnames=sql-server&sort=stats&pagesize=30 –

+0

Gracias, tu respuesta me ha ayudado a entender por qué ocurre esto. – Kelsey