2012-04-02 30 views
5

que tienen consulta por ejemplo:¿Por qué utilizar SQL Server bucle anidado

SELECT TOP 10 
    User.id, 
    User.Name, 
    Country.Country 
    FROM User 
    Inner Join Country 
    ON Country.Id = User.CountryId 
    where User.PlanId = 1 

En este espectáculo administrador de casos SQL en el plan de ejecución que utilizan Hash-partido y es bastante rápido.

Pero si uso donde User.PlanId = 2 SQL manager uso el bucle anidado para mi consulta y es muy lento ... ¿Por qué con diferentes criterios de búsqueda utiliza algoritmo diferente? ¿Cómo puedo arreglarlo?

+2

También cuántas filas en la tabla, cuántas tienen PlanId = 1, y cuántas tienen PlanId = 2? –

+0

'Country.Id' es una clave principal o al menos única? hmm ... a veces la solución alternativa puede ser usar 'left join' + add condition' y user.countryid no es nulo' .. – Aprillion

+0

Tengo planId = 1 alrededor de 2500 filas y planId = alrededor de 280 filas. Y Country.Id = User.CountryId tiene una relación de uno a uno – Reno

Respuesta

3

voy a suponer que usted tiene un número mucho mayor de usuarios con un PlanID de que con 2 1.

Esto explicará tanto el cambio en el plan ejecutivo y el tiempo de ejecución. Un HASH MATCH es la combinación más versátil (y generalmente menos eficiente). Básicamente, el motor crea una tabla que empareja todos los valores manualmente.

A NESTED LOOP comprueba cada valor de la izquierda con cada valor de la derecha, y funciona bien cuando un conjunto de datos es mucho más grande que el otro y ambos lados están indexados.

A HASH MATCH puede ser rápido si tiene un conjunto de datos realmente pequeño. Sospecho que la diferencia de velocidad se debe a la diferencia de tamaño de los conjuntos de datos. Puede comprobar esto muy fácilmente por:

SELECT PlanId, COUNT(*) as CT 
FROM User 
GROUP BY PlanID 

... que le dará su distribución.

Cuestiones relacionadas