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

解决方案 »

  1.   

    execution plan cache的问题。
      

  2.   

    改改你的SP,在可能比较耗时的语句后面加上option(recompile)
      

  3.   

    新编译存储过程
    在用诸如添加索引或更改索引列中的数据等操作更改数据库时,应通过重新编译访问数据库表的原始查询计划使其得到重新优化。在重新启动 Microsoft® SQL Server™ 2000 后第一次运行存储过程时自动发生该优化。当存储过程使用的基础表更改时也会发生优化。但是如果添加了存储过程可能从中受益的新索引,将不发生自动优化,直到下一次 SQL Server 重新启动后再运行该存储过程时为止。SQL Server 提供三种重新编译存储过程的方法: sp_recompile 系统存储过程强制在下次运行存储过程时进行重新编译。
    创建存储过程时在其定义中指定 WITH RECOMPILE 选项,表明 SQL Server 将不对该存储过程计划进行高速缓存;该存储过程将在每次执行时都重新编译。当存储过程的参数值在各次执行间都有较大差异,导致每次均需创建不同的执行计划时,可使用 WITH RECOMPILE 选项。此选项并不常用,因为每次执行存储过程时都必须对其进行重新编译,这样会使存储过程的执行变慢。
    在执行存储过程时指定 WITH RECOMPILE 选项,可强制对存储过程进行重新编译。仅当所提供的参数不典型,或者自创建该存储过程后数据发生显著更改时才应使用此选项。 
    说明  如果删除或重命名了存储过程所引用的对象,那么在执行该存储过程时会返回错误。但如果用同名对象替换了存储过程中引用的对象,则可以不进行重新编译而继续执行该存储过
      

  4.   

    加上option(recompile)有什么意义?
    正常情况下,存储过程中的语句执行都很快,只是存储过程中有6个条件判断,不知是否有影响·
      

  5.   

    这问题高深,如果楼主用with RECOMPILE解决了,就我就算是学习了
      

  6.   

    那样是重新编译了一下存储过程,将执行计划更新了创建存储过程时在其定义中指定 WITH RECOMPILE 选项,表明 SQL Server 将不对该存储过程计划进行高速缓存;该存储过程将在每次执行时都重新编译 
      

  7.   


    存储过程执行时传的参数不同,可能会导致执行的效能出现差异,原因是存储过程的编译时在首次调用时发生,以后的执行,不管传的什么参数都是以第一次产生的执行计划来执行。你更新存储过程后,会以导致再次编译,所以会快。 加option(recompile)的目的是以传的参数再次编译你的语句。
      

  8.   

    支持,
    加上 with RECOMPILE
    试试效果
      

  9.   

    加上with RECOMPILE对存储过程的执行效率有多大影响?
      

  10.   


    看你的CPU负载有多大,一般来说影响很小。
      

  11.   

    简单的举个例子吧,一个表数据里面ID列 1000行,1 个1 其余全部是2 在ID上有索引你过程以ID为参数,第一次传入ID为1,执行索引查找,
    而第二次你以2为参数,这样如果还是查找的话,效率显然不怎么好,不如表扫描了这是性能调优里面一个例子好像,不知道记错没
      

  12.   

    顶下
    with recompile真的解决了我的问题