今天执行一个存储过程, 发现2个小时都执行不完, 郁闷……后来改为用SQL语句直接在查询分析器中直接执行, 6到7分钟就搞定了。搜索了很多内容, 据说变量代替参数是有用的, 死马当活马医地将存储过程的参数改为变量试了下, 居然也是6到7分钟, ……诸位大侠, 请问这个有 具体依据 吗?原来: @dbId BIGINT,
@areaId BIGINT,
@timeKey INT==> @dbId BIGINT,
@areaId BIGINT,
@timeKey INT
AS
BEGIN
DECLARE @dbId_rep BIGINT
DECLARE @areaId_rep BIGINT
DECLARE @timeKey_rep INT

SELECT @dbId_rep=@dbId, 
   @areaId_rep = @areaId, 
   @timeKey_rep = @timeKey
-- ....

解决方案 »

  1.   

    这是我找的资料, 不过是 Orcle 的:
    http://www.itpub.net/forum.php?mod=viewthread&tid=714336&highlight=
      

  2.   

    初看是参数嗅探问题,
    你可以用option(recompile) 先试一下。
    另外,你怎么不把详细的T-SQL发出来啊。
      

  3.   


    后来发现, 是因为 tempdb 增长过快导致了这个问题[存储过程执行很慢], 感谢各位捧场。不好意思, 再问问, 如何不让 tempdb 增长太快? 几乎5分钟就可以增长4GB!
      

  4.   


    后来发现, 是因为 tempdb 增长过快导致了这个问题[存储过程执行很慢], 感谢各位捧场。不好意思, 再问问, 如何不让 tempdb 增长太快? 几乎5分钟就可以增长4GB!
    瞎说,前后矛盾,
    如果是tempdb的问题,那你用SP的参数的时候就慢,成本地变量就变快啦?
      

  5.   

    TEMPDB能不能设置为简单恢复模式 
    频繁的读写是会导致TEMPDB增长过快的。
      

  6.   

    tempdb本来就是简单模式,应该初始化大一点,不然频繁增长收缩肯定有性能问题
      

  7.   

    TEMPDB只能为简单恢复模式 
      

  8.   

    TEMPDB只能为简单恢复模式 恩恩。搞晕了
      

  9.   


    谢谢版主赏光!TEMPDB已设置为简单恢复模式……由于这个系统主要功能是数据采集, 数据频繁读写避免不了。目前我已经把 tempdb 的数据文件增加了一个到D分区,日志文件也增加了一个到D分区。如下图。 
    如果这样能速度跟得上, 而且大小也不再增加, 那我也就安心了。 
    就是有点怕无限制地增长……
     
      

  10.   

    TEMPDB放到另外一块磁盘是个好的解决办法 日志最大值设置为10G会不会太小?
      

  11.   


    应该差不多了, 我后来观察到, tempdb 稳定在 17G 左右, 而且可用空间为 99% (可能在采集数据时不会是这样)。谢谢版主, 也谢谢各位大侠, 散分结帖!