您的位置:首页 > 运维架构

让存储过程中的查询语句按照不同查询条件进行优化(即每次查询都使用参数option(recompile))

2011-02-26 13:10 851 查看
ASP.NET调用SQL后台存储过程时,有时突然就变得很慢,在后台直接执行存储过程没问题,但在前台调用存储过程时就是很慢,而且在前台调用成功后,再次调用还是一样的慢,但更新一下存储过程再调用就很快了。但这始终不能彻底解决问题,过段时间又会出来同样的问题。环境(NET2.0+SQL2005)

解决办法:

简单方法一:在可能比较耗时的语句后面加上option(recompile)

方法二:新编译存储过程
在用诸如添加索引或更改索引列中的数据等操作更改数据库时,应通过重新编译访问数据库表的原始查询计划使其得到重新优化。在重新启动 Microsoft® SQL Server™ 2000 后第一次运行存储过程时自动发生该优化。当存储过程使用的基础表更改时也会发生优化。但是如果添加了存储过程可能从中受益的新索引,将不发生自动优化,直到下一次 SQL Server 重新启动后再运行该存储过程时为止。

SQL Server 提供三种重新编译存储过程的方法:

sp_recompile 系统存储过程强制在下次运行存储过程时进行重新编译。

创建存储过程时在其定义中指定 WITH RECOMPILE 选项,表明 SQL Server 将不对该存储过程计划进行高速缓存;该存储过程将在每次执行时都重新编译。当存储过程的参数值在各次执行间都有较大差异,导致每次均需创建不同的执行计划时,可使用 WITH RECOMPILE 选项。此选项并不常用,因为每次执行存储过程时都必须对其进行重新编译,这样会使存储过程的执行变慢。

在执行存储过程时指定 WITH RECOMPILE 选项,可强制对存储过程进行重新编译。仅当所提供的参数不典型,或者自创建该存储过程后数据发生显著更改时才应使用此选项。

说明 如果删除或重命名了存储过程所引用的对象,那么在执行该存储过程时会返回错误。但如果用同名对象替换了存储过程中引用的对象,则可以不进行重新编译而继续执行该存储过
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐