小编典典

SQL Server-存储过程突然变慢

sql

我写了一个存储过程,昨天通常在不到一秒钟的时间内完成。今天,大约需要18秒。我昨天也遇到了这个问题,似乎可以通过删除并重新创建存储过程来解决。如今,这种技巧似乎没有奏效。:(

有趣的是,如果我复制存储过程的主体并将其作为直接查询执行,它将很快完成。它似乎是一个存储过程,正在减慢它的速度……!

有谁知道可能是什么问题?我一直在寻找答案,但是通常他们建议通过Query Analyser运行它,但是我没有它-我现在正在使用SQL Server 2008Express。

存储过程如下;

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上有一个空间索引。


阅读 461

收藏
2021-03-23

共1个答案

小编典典

嗯,查询计划会糟透吗?

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

下次运行缓慢时,可能会使用查询分析器拨打电话并获得所选计划-并查看其外观。

如果是这样,请在每次调用时放入opton来重新编译SP(并重新编译)。

2021-03-23