我写了一个存储过程,昨天通常在不到一秒钟的时间内完成。今天,大约需要18秒。我昨天也遇到了这个问题,似乎可以通过删除并重新创建存储过程来解决。如今,这种技巧似乎没有奏效。 :(
有趣的是,如果我复制存储过程的主体并将其作为直接查询执行,它将很快完成。它似乎是一个存储过程,正在减慢它的速度……!
有谁知道可能是什么问题?我一直在寻找答案,但是通常他们建议通过Query Analyser运行它,但是我没有它-我现在正在使用SQL Server 2008 Express。
存储过程如下;
更改步骤[dbo]。[spGetPOIs]
@ lat1 float ,
@ lon1 float ,
@ lat2 float ,
@ lon2 float ,
@minLOD tinyint,
@maxLOD tinyint,
@精确位
作为
开始
-将查询矩形创建为多边形
DECLARE @bounds地理;
SET @bounds = dbo.fnGetRectangleGeographyFromLatLons(@ lat1,@ lon1,@ lat2,@ lon2);
-执行选择
如果(@exact = 0)
开始
选择[ID],[名称],[类型],[数据],[MinLOD],[MaxLOD],[位置]。[纬度] AS [纬度],[位置]。[Long] AS [经度],[ SourceID]
来自[兴趣点]
在哪里
不((@maxLOD [MaxLOD]))和
(@ bounds.Filter([Location])= 1)
结尾
别的
开始
选择[ID],[名称],[类型],[数据],[MinLOD],[MaxLOD],[位置]。[纬度] AS [纬度],[位置]。[Long] AS [经度],[ SourceID]
来自[兴趣点]
在哪里
不((@maxLOD [MaxLOD]))和
(@ bounds.STIntersects([Location])= 1)
结尾
结尾
“POI”表在MinLOD,MaxLOD上有一个索引,在Location上有一个空间索引。
最佳答案
嗯,查询计划会糟透吗?
SP的编译/查询lpan取决于首次使用-取决于参数。因此,第一次调用的参数(当不存在lpan时)确定查询计划。我一度从缓存中删除,生成了新计划。
下次运行缓慢时,可能会使用查询分析器拨打电话并获得所选计划-并查看其外观。
如果是这样,请在每次调用时放入opton来重新编译SP(并重新编译)。