2011-09-09 15 views
5

Estoy teniendo un momento bastante difícil para encontrar por qué agregar un índice en la clave externa de una tabla está ralentizando la vista de mi colega. Esta vista se compone de varias vistas empaquetadas con unión externa y unión interna. Traté de eliminarlos uno por uno para descubrir dónde estaba el problema, pero no puedo decir que no parece venir de una vista en particular, sino más bien de todos.¿Cómo puede un índice ralentizar una declaración de selección?

Sabía que los índices podían ralentizar la inserción o que estaban tomando tamaño en el disco duro, pero nunca he leído en ninguna parte que pudieran ser responsables de ralentizar una vista. La verdad es cuando lo hago:

DBCC FREEPROCCACHE 
DBCC DROPCLEANBUFFERS 
GO 

select top 20 * from MyView 

Tarda 20 segundos con el índice y 9 sin.

CREATE NONCLUSTERED INDEX [IX_MyField] ON [dbo].MyTable 
(
    [MyField] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, 
    IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, 
    ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY] 
+1

¿Miraste el plan de consulta para ver qué estaba pasando? –

+0

En teoría, el índice hace que el optimizador considere más opciones al construir el plan, que si decidiera que necesitaba un escaneo de tabla de todos modos podría ralentizarlo. Sin embargo, dudo que alguna vez tenga un efecto mensurable. ¿Puedes publicar la consulta que se ve afectada? – JohnFx

+0

¿Dijo que la vista es una vista que llama a vistas (o lo malinterpreté)? Debe detenerlo de inmediato si es así. Estas vistas deben materializar completamente todas las vistas inferiores para funcionar y son extremadamente lentas cuando hay una gran cantidad de datos involucrados. Es un antipatrón SQL para tener vista llamar a otras vistas. – HLGEM

Respuesta

9

Es posible que sus OTROS índices o estadísticas estén desactualizados. Si no están actualizados, es posible que el analizador de consultas elija un plan de ejecución subóptimo utilizando su nuevo índice, ya que cree que será más rápido.

intente ejecutar:

UPDATE STATISTICS WITH (FULLSCAN)

en su mesa.

+1

¡Eso me gusta! ¡Salvaste mi semana! – Arthis

+1

Feliz de ayudar y me alegro de que funcionó. Problemas como este son difíciles de solucionar muchas veces. – JNK

2

¿Está seleccionando otras columnas de MyTable? Si es así, probablemente esté haciendo una búsqueda de marcador (o búsqueda de RID), lo que significa que va a regresar a su tabla para obtener los datos adicionales.

Debe colocar las columnas que seleccione adicionalmente en la cláusula INCLUDE del índice.

Ejecute ambas consultas con planes de ejecución habilitados y compare los 2, identificando qué partes de la consulta toman más tiempo.

+0

Gracias por su explicación, no resolvió mi problema, pero me ayudó a entender un poco más cómo están funcionando los índices. ¡Que tengas un buen día! – Arthis

Cuestiones relacionadas