J'ai écrit une procédure stockée qui, hier, généralement terminée en moins d'une seconde. Aujourd'hui, cela prend environ 18 secondes. J'ai également rencontré le problème hier, et il semblait être résolu par DROPing et re-CREATE la procédure stockée. Aujourd'hui, cette astuce ne semble pas fonctionner. :(SQL Server - procédure stockée devient soudainement lente
Fait intéressant, si je copie le corps de la procédure stockée et l'exécuter comme une requête simple, il termine rapidement. Il semble être le fait que ce soit une procédure stockée qui est le ralentir ...!
Est-ce que quelqu'un sait quel est le problème? J'ai cherché des réponses, mais il est souvent recommandé de l'exécuter via l'Analyseur de requêtes, mais je ne l'ai pas - J'utilise SQL Server 2008 Express pour l'instant
La procédure stockée est la suivante:
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 table 'POI' a un index sur MinLOD, MaxLOD et un index spatial sur Location.
Cela pourrait bien l'être. J'ai modifié la procédure stockée pour la recompiler avec chaque appel et il semble (POUR MAINTENANT!) Avoir accéléré les choses de manière significative. Merci! Existe-t-il un moyen d'éviter la recompilation et les mauvais plans de requête? – Barguast
Non. Ce que vous pouvez faire est vider la procédure stockée et utiliser SQL dynamique ... de sorte que les plans de requête sont régénérés chaque appel. C'est un problème connu (difficile à comprendre tous, comme KM) avec des procédures stockées - ils se transforment parfois en plans de requête VRAIMENT mauvais. – TomTom