Я написал хранимую процедуру, которая вчера, как правило, завершалась в течение секунды. Сегодня это занимает около 18 секунд. Вчера я столкнулся с проблемой, и она, похоже, была решена с помощью DROPing и re-CREATEing хранимой процедуры. Сегодня этот трюк, похоже, не работает. :(SQL Server - хранимая процедура внезапно становится медленной
Интересно, если я копирую тело хранимой процедуры и выполнить его как простой запрос он завершает быстро. Это, кажется, тот факт, что это хранимая процедура, которая замедляет его вниз ...!
Кто-нибудь знает, в чем проблема? Я искал ответы, но часто они рекомендуют запускать его через Query Analyzer, но у меня его нет - я использую SQL Server 2008 Express на данный момент.
Сохраненная процедура заключается в следующем:
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
Таблица «POI» имеет индекс для MinLOD, MaxLOD и пространственный индекс для местоположения.
Это вполне может быть. Я изменил хранимую процедуру, чтобы перекомпилировать с каждым вызовом, и кажется (НАСЛЕДУЮ!), Чтобы значительно ускорить процесс. Благодаря! Есть ли способ избежать перекомпиляции и плохих планов запросов? – Barguast
Нет. Что вы можете сделать, это сбросить хранимую процедуру и использовать динамический sql ... так что планы запросов восстанавливаются при каждом вызове. Это известная проблема (жесткие не все, похоже, понимают ее, как KM) с хранимыми процедурами - они иногда превращаются в ДЕЙСТВИТЕЛЬНО плохие планы запросов. – TomTom