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]
¿Miraste el plan de consulta para ver qué estaba pasando? –
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
¿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