SQL Server - хранимая процедура внезапно становится медленной

Я записал хранимую процедуру, которая, вчера, обычно завершалась менее чем за секунду. Сегодня, требуется приблизительно 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 и пространственном индексе на Местоположении.

6
задан Barguast 17 March 2010 в 13:00
поделиться

2 ответа

А, может это план запросов хреновый?

SP'шники компилируются/план запроса детерминируется при ПЕРВОМ обращении - в зависимости от параметров. Таким образом, параметры первого вызова (когда нет lpan) определяют план запроса. В один момент i удаляется из кэша, генерируется новый план.

В следующий раз, когда он будет работать медленно, возможно, сделайте вызов с помощью анализатора запросов и получите выбранный план - и проверьте, как он выглядит.

если это так - поставьте опцию перекомпиляции SP при каждом вызове (с перекомпиляцией).

3
ответ дан 17 December 2019 в 04:45
поделиться

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
2
ответ дан 17 December 2019 в 04:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: