Я записал хранимую процедуру, которая, вчера, обычно завершалась менее чем за секунду. Сегодня, требуется приблизительно 18 секунд. Я столкнулся с проблемой вчера также, и это, казалось, было решено путем ОТБРАСЫВАНИЯ и re-CREATEing хранимая процедура. Сегодня, тот прием, кажется, не работает.:(
Интересно, если я копирую тело хранимой процедуры и выполняю его как простой запрос, это завершается быстро. Это, кажется, то, что это - хранимая процедура, это замедляет его...!
Кто-либо знает, какова проблема могла бы быть? Я искал ответы, но часто они рекомендуют выполнить его через Анализатор Запроса, но я не имею, имеют его - я использую Экспресс SQL Server 2008 года на данный момент.
Хранимая процедура следующим образом;
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 и пространственном индексе на Местоположении.
А, может это план запросов хреновый?
SP'шники компилируются/план запроса детерминируется при ПЕРВОМ обращении - в зависимости от параметров. Таким образом, параметры первого вызова (когда нет lpan) определяют план запроса. В один момент i удаляется из кэша, генерируется новый план.
В следующий раз, когда он будет работать медленно, возможно, сделайте вызов с помощью анализатора запросов и получите выбранный план - и проверьте, как он выглядит.
если это так - поставьте опцию перекомпиляции SP при каждом вызове (с перекомпиляцией).
parameter sniffing google it. попробуйте это, что "перемапирует" входные параметры в локальные переменные, чтобы предотвратить попытки SQL Server угадать план запроса на основе параметров:
ALTER PROCEDURE [dbo].[spGetPOIs]
@lat1 float,
@lon1 float,
@lat2 float,
@lon2 float,
@minLOD tinyint,
@maxLOD tinyint,
@exact bit
AS
BEGIN
DECLARE @X_lat1 float,
@X_lon1 float,
@X_lat2 float,
@X_lon2 float,
@X_minLOD tinyint,
@X_maxLOD tinyint,
@X_exact bit
-- Create the query rectangle as a polygon
DECLARE @bounds geography;
SET @bounds = dbo.fnGetRectangleGeographyFromLatLons(@X_lat1, @X_lon1, @lX_at2, @X_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 ((@X_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 ((@X_maxLOD [MaxLOD])) AND
(@bounds.STIntersects([Location]) = 1)
END
END