SQL Server - 存储过程突然变慢

Bar*_*ast 6 sql indexing stored-procedures spatial

我写了一个存储过程,昨天通常在一秒钟内完成.今天,大约需要18秒.我昨天遇到了问题,它似乎通过DROPing和重新创建存储过程来解决.今天,这个技巧似乎没有奏效.:(

有趣的是,如果我复制存储过程的主体并将其作为简单的查询执行,它会很快完成.事实上,这是一个存储过程会减慢它的速度......!

有谁知道问题可能是什么?我已经搜索了答案,但他们经常建议通过查询分析器运行它,但我没有 - 我现在正在使用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和Location上的空间索引的索引.

小智 4

啊,难道查询计划很糟糕吗?

SP 的编译/查询计划在首次使用时确定 - 取决于参数。因此,第一次调用的参数(当不存在计划时)确定查询计划。有一次我从缓存中删除,生成了新计划。

下次运行缓慢时,可能会使用查询分析器进行调用并获取选定的计划 - 并检查它的外观。

如果是这样 - 添加一个选项,在每次调用时重新编译 SP(使用重新编译)。