He escrito un procedimiento almacenado que, ayer, normalmente se completaba en menos de un segundo. Hoy, toma alrededor de 18 segundos. También me encontré con el problema ayer, y pareció resolverse con DROP y volver a CREAR el procedimiento almacenado. Hoy, ese truco no parece estar funcionando. :(Servidor SQL: el procedimiento almacenado se vuelve lento
Curiosamente, si copio el cuerpo del procedimiento almacenado y ejecutarlo como una consulta directa se completa rápidamente. Parece ser el hecho de que es un procedimiento almacenado que está disminuyendo su velocidad ...!
¿Alguien sabe cuál podría ser el problema? He buscado las respuestas, pero a menudo recomiendan ejecutarlo a través del Analizador de consultas, pero no lo tengo - Estoy usando SQL Server 2008 Express por ahora.
El procedimiento almacenado es el siguiente;
ALTER PROCEDURE [dbo].[spGetPOIs] @lat1 float, @lon1 float, @lat2 float, @lon2 float, @minLOD tinyint, @maxLOD tinyint, @exact bit AS BEGIN -- Create the query rectangle as a polygon DECLARE @bounds geography; SET @bounds = dbo.fnGetRectangleGeographyFromLatLons(@lat1, @lon1, @lat2, @lon2); -- Perform the selection if (@exact = 0) BEGIN SELECT [ID], [Name], [Type], [Data], [MinLOD], [MaxLOD], [Location].[Lat] AS [Latitude], [Location].[Long] AS [Longitude], [SourceID] FROM [POIs] WHERE NOT ((@maxLOD [MaxLOD])) AND (@bounds.Filter([Location]) = 1) END ELSE BEGIN SELECT [ID], [Name], [Type], [Data], [MinLOD], [MaxLOD], [Location].[Lat] AS [Latitude], [Location].[Long] AS [Longitude], [SourceID] FROM [POIs] WHERE NOT ((@maxLOD [MaxLOD])) AND (@bounds.STIntersects([Location]) = 1) END END
La tabla 'PDI' tiene un índice en MinLOD, MaxLOD y un índice espacial en Location.
Esto bien puede ser la misma. Alteré el procedimiento almacenado para recompilar con cada llamada y parece (¡POR AHORA!) Haber acelerado las cosas de manera significativa. ¡Gracias! ¿Hay alguna manera de evitar la recompilación Y los malos planes de consulta? – Barguast
No. Lo que puede hacer es volcar el procedimiento almacenado y usar sql dinámico ... para que los planes de consulta se regeneren en cada llamada. Este es un problema conocido (difícil de entender, no todos lo entienden, como KM) con procedimientos almacenados: a veces se convierten en planes de consulta REALMENTE malos. – TomTom