2009-07-21 14 views
19

SQL 2000
La tabla NED tiene una clave externa a la tabla SIGN NED.RowID a SIGN.RowID
La mesa de registro tiene una clave externa a la tabla SIGN.SignID NED a NED.SignID
ROWID y SignID son las claves principales que son agrupados GUID (no es mi elección)
la cláusula WHERE es:¿Por qué hay un análisis en mi índice agrupado?

FROM 
    [SIGN] A 
    INNER JOIN NED N ON A.SIGNID = N.SIGNID 
    INNER JOIN Wizard S ON A.WizardID = S.WizardID 
    INNER JOIN [Level] SL ON N.LevelID = SL.LevelID 
    LEFT JOIN Driver DSL ON SL.LevelID = DSL.LevelID 
     AND DSL.fsDeptID = @fsDeptID 
    INNER JOIN [Character] ET ON S.CharacterID = ET.CharacterID 
    INNER JOIN Town DS ON A.TownID = DS.TownID 
WHERE 
    (A.DeptID = @DeptID OR 
    S.DeptID = @DeptID 
    AND 
    A.[EndTime] > @StartDateTime AND A.[StartTime] < @EndDateTime 
    AND 
    A.NEDStatusID = 2  

¿por qué hay un recorrido de índice en la mesa de registro para esta consulta? ¿Qué causaría un escaneo de índice en un índice agrupado? Gracias

+0

Tengo que preguntar qué esperas de esta consulta o más bien ¿por qué crees que un escaneo de índice es un problema en este caso? – Welbog

+0

¿Viene de otro DBMS y espera ver algo así como una combinación de hash o una combinación de clúster? En caso afirmativo, debe tener en cuenta que en SQL Server, un índice agrupado es simplemente un índice de árbol donde los nodos hoja son las páginas de datos. Si ya sabía esto, entonces ignore este comentario. – kdgregory

Respuesta

14

Porque su cláusula WHERE no está contra columnas indexadas.

+5

Esto es cierto, pero en realidad no explica nada. –

+2

Pero respondió su pregunta. :) – MyItchyChin

+0

No mencionó los índices que tenía. Pero es una suposición válida y común. – Suncat2000

22

Una exploración de índice agrupado es cómo SQL Server designa una exploración de tabla completa en una tabla con un índice agrupado. Esto se debe a que no tiene suficientes índices en la tabla SIGN para satisfacer la cláusula WHERE, o porque decidió que la tabla SIGN es lo suficientemente pequeña (o los índices no son lo suficientemente selectivos) para que una exploración de tabla sea más eficiente.

Simplemente examinando la consulta, probablemente tendrías que indexar la columna DeptID así como alguna combinación de StartTime, EndTime y NEDStatusID para evitar la exploración de la tabla. Si la razón por la que pregunta es porque tiene problemas de rendimiento, también puede ejecutar el Asistente de ajuste de índice (ahora el Asesor de ajuste de motor de base de datos en las herramientas de cliente SQL2005 +) y hacer que le aconseje sobre qué índices crear para acelerar su consulta.

2

Usted tiene varias restricciones en el signo Una mesa, si leo esto correctamente:

WHERE 
     (A.DeptID = @DeptID OR 
     S.DeptID = @DeptID 
     AND 
     A.[EndTime] > @StartDateTime AND A.[StartTime] < @EndDateTime 
     AND 
     A.NEDStatusID = 2 

¿Alguna de estas restricciones (como DeptID, Hora de inicio, EndTime, NEDStatusID) indexados? ¿Qué tan bien son esos campos seleccionando de su conjunto de datos?

Si tiene 10 mio. filas y NEDStatusID tiene solo 10 valores posibles, entonces cualquier restricción en ese campo siempre arrojará aprox. 1 mio. filas: en ese caso, podría ser más sencillo (y menos costoso) que SQL Server realice una exploración de tabla completa (análisis de índice agrupado), especialmente si también necesita verificar cláusulas WHERE adicionales en la misma tabla que no están indexadas. , ya sea (StartTime, EndTIme, etc.).

Marc

Cuestiones relacionadas