SQL Server - 存储过程突然变慢

标签 sql stored-procedures indexing spatial

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

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

有谁知道问题可能是什么?我已经搜索过答案,但他们通常建议通过查询分析器运行它,但我没有 - 我现在使用的是 SQL Server 2008 Express。

存储过程如下;

更改程序 [dbo].[spGetPOI]
@lat1 float ,
@lon1 float ,
@lat2 float ,
@lon2 float ,
@minLOD tinyint,
@maxLOD tinyint,
@精确位
作为
开始
-- 将查询矩形创建为多边形
声明@bounds 地理;
SET @bounds = dbo.fnGetRectangleGeographyFromLatLons(@lat1, @lon1, @lat2, @lon2);

-- 执行选择
如果(@exact = 0)
开始
SELECT [ID], [Name], [Type], [Data], [MinLOD], [MaxLOD], [Location].[Lat] AS [Latitude], [Location].[Long] AS [Longitude], [来源 ID]
来自 [兴趣点]
在哪里
不是 ((@maxLOD [MaxLOD])) 和
(@bounds.Filter([位置]) = 1)
结尾
别的
开始
SELECT [ID], [Name], [Type], [Data], [MinLOD], [MaxLOD], [Location].[Lat] AS [Latitude], [Location].[Long] AS [Longitude], [来源 ID]
来自 [兴趣点]
在哪里
不是 ((@maxLOD [MaxLOD])) 和
(@bounds.STIntersects([位置]) = 1)
结尾

结尾

'POI' 表在 MinLOD、MaxLOD 上有一个索引,在 Location 上有一个空间索引。

最佳答案

啊,是不是查询计划很烂?

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

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

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

关于SQL Server - 存储过程突然变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2462312/

相关文章:

mongodb - 为什么索引的方向在 MongoDB 中很重要?

SQL 在比较连续 DataRow 中的值时使用 PARTITION

python - linux pyodbc 连接错误 "Can' t 打开 lib 'SQL Server Native Client11.0'“

PostgreSQL存储过程,如何返回结果集

mysql 存储过程 - 选择...进行更新

javascript - 从多个数组中提取随机项

sql - pgAdmin III 的错误行为?

执行 count() 后与 Group by 子句一起使用的 SQL where 子句

sql-server - SQL : All the suggested GetDate () methods are not working

MySQL索引帮助——哪个更快?