usar unico una tablas tabla nonclustered indice indexar index ejecutar create consultar como clustered sql sql-server clustered-index

sql - unico - ¿Por qué hay un análisis en mi índice agrupado?



indices clustered y nonclustered sql server (4)

SQL 2000
La tabla NED tiene una clave externa a la tabla SIGN NED.RowID a SIGN.RowID
La tabla SIGN tiene una clave externa a la tabla NED SIGN.SignID a NED.SignID
RowID y SignID son claves primarias agrupadas que son GUID (no es mi elección)
La cláusula WHERE es:

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 una EXPLORACIÓN DE ÍNDICE en la tabla SIGN para esta consulta? ¿Qué causaría una exploración de índice en un índice agrupado? Gracias


Aquí hay una buena publicación en el blog sobre cuándo SQL Server llega al "punto de inflexión" y cambia de una búsqueda de índice a una exploración de índice / tabla:

http://www.sqlskills.com/BLOGS/KIMBERLY/post/The-Tipping-Point-Query-Answers.aspx

Es posible que desee ver la forma en que se filtran sus consultas, ya que el punto de inflexión es a menudo mucho menos filas de lo que la gente espera.


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


Tienes varias restricciones en la tabla SIGN A, 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 esas restricciones (como DeptID, StartTime, EndTime, NEDStatusID) está indexada? ¿Qué tan bien están seleccionando esos campos de su conjunto de datos?

Si tienes 10 mio. las filas y NEDStatusID tienen solo 10 valores posibles, entonces cualquier restricción en ese campo siempre arrojaría aprox. 1 mio. filas: en ese caso, podría ser más fácil (y menos costoso) que SQL Server realice una exploración completa de la tabla (exploración 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.).

Bagazo


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 que los índices no son lo suficientemente selectivos) para que una exploración de la tabla sea más eficiente.

Con solo examinar la consulta, probablemente tenga que indexar la columna DeptID y alguna combinación de StartTime, EndTime y NEDStatusID para evitar el escaneo de la tabla. Si la razón por la que pregunta es porque tiene problemas de rendimiento, también puede ejecutar el Asistente de optimización de índices (ahora el Asesor de optimización de motor de base de datos en las herramientas de cliente SQL2005 +) y pedirle algunos consejos sobre qué índices crear para acelerar su consulta.