当前位置: 首页 > 面试题库 >

SQL Server-存储过程突然变慢

冯峻
2023-03-14
问题内容

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

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

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

存储过程如下;

更改步骤[dbo]。[spGetPOIs]
    @ lat1浮动,
    @ lon1浮动,
    @ lat2浮动,
    @ lon2浮动,
    @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(并重新编译)。



 类似资料:
  • 问题内容: 我有一张桌子,我需要在99%的时间内自动分配ID(其他1%似乎使用身份列来排除)。因此,我有一个存储过程来获取以下行中的下一个ID: `` 检查必须检查用户是否手动使用了ID并找到下一个未使用的ID。 当我依次调用它并返回1、2、3时,它可以正常工作。我需要做的是在多个进程同时调用此方法的情况下提供一些锁定。理想情况下,我只需要它专用于围绕此代码锁定last_auto_id表,以便第二

  • 本文向大家介绍sqlserver中存储过程的递归调用示例,包括了sqlserver中存储过程的递归调用示例的使用技巧和注意事项,需要的朋友参考一下 递归式指代码片段调用自身的情况;危险之处在于:如果调用了自身一次,那么如何防止他反复地调用自身。也就是说提供递归检验来保证适当的时候可以跳出。 以阶层为例子说存储过程中递归的调用。 递归 当创建此存储过程时候,会遇见一条报告信息

  • 问题内容: 昨天,当我尝试构建公共服务时,它会产生错误 253原因:org.eclipse.aether.resolution.ArtifactResolutionException:无法解决以下工件:org.geotools:gt- main:jar:21.2,org.geotools:gt-epsg-wkt:jar:21.2,org。 geotools:gt-epsg- hsql:jar:21

  • 数据访问层支持存储过程调用,调用数据库存储过程使用下面的方法: $resultSet = Db::query('call procedure_name'); foreach ($resultSet as $result) { } 存储过程返回的是一个数据集,如果你的存储过程不需要返回任何的数据,那么也可以使用execute方法: Db::execute('call procedure_name'

  • 本文向大家介绍SqlServer 2000、2005分页存储过程整理第1/3页,包括了SqlServer 2000、2005分页存储过程整理第1/3页的使用技巧和注意事项,需要的朋友参考一下 sql server 2005的分页存储过程分3个版本,一个是没有优化过的,一个是优化过的,最后一个支持join的,sql server 2000的分页存储过程,也可以运行在sql server 2005上,

  • 问题内容: 我试图在postgres 9.3上使用sql调用函数内的函数。 这个问题与我的另一篇文章有关。 我写了下面的函数。到目前为止,我还没有合并任何类型的save-output(COPY)语句,因此我试图通过创建嵌套函数print-out函数来解决此问题。 以上功能有效。 尝试创建嵌套函数。 调用嵌套函数。 输出 上面给出了这个。但是,当在print_out()中将arg1,arg2替换为’