做过数据库程序的可能都有这样的感受:当调用存储过程时,第一次比较慢,随后第二次开始调用时速度就会快了。可是今天我碰到了一件这样的事,我在调用一个存储过程的时候第一次极快(2至4秒)可是从第二次开始就极慢了!(有可能超过半小时!)
我仔细的查看了我的存储过程的调用的代码,没看出一点问题,不知道有哪位朋友也遇到过我这样的怪事没有?
我用的数据库是sql server2000,Delphi6
C/S结构把存储过程在SQL中运行的时候,第一次会慢些,从第二次调用时也是极快的,几乎不到一秒就出结果了。用的AdoStoredProc控件,CacheSize设到了1000也没什么用
强制退出程序后,再次运行程序,也是第一次极快,第二次以后就慢得不行了。
我做的其它存储过程没这样的现象,速度也是极快。

解决方案 »

  1.   

    下面是我调用这个存储过程的代码
      with ADOStoredProc1 do
        begin
         Parameters.ParamByName('@mLastYearEndDate').Value:=mYearBeginDate;
         Parameters.ParamByName('@mLastMonthEndDate').Value:=mMonthBeginDate;
         Parameters.ParamByName('@mLastDate').Value:=mLastDate;
         Parameters.ParamByName('@mNowDate').Value:=myDate;
         Parameters.ParamByName('@mLastSameDate').Value:=mLastSameDate;
         Parameters.ParamByName('@mLastMinDate').Value:=mLastYearMinDate;
         Parameters.ParamByName('@mLastMaxDate').Value:=mLastYearMaxdate;
         Parameters.ParamByName('@mNowMinDate').Value:=mYearMinDate;
         Parameters.ParamByName('@mLastDays').Value:=xLastDays;
         Parameters.ParamByName('@mLastMonthDays').Value:=xLastMonthsDays;
         Parameters.ParamByName('@mNowDays').Value:=xNowDays;
         Prepared;
         ExecProc;
        end;
      

  2.   

    to zsjzwj(北极熊) :
    我进程序后,只调用这个存储过程也是同样的情况啊,你说会有什么资源要释放呢?
      

  3.   

    调用的同时也去查看了cpu的占用率什么的,也没看出什么问题,CPU的占用率也不是很高
    在2%至8%之间跳
      

  4.   

    to zhoutian618(秦失其鹿,天下共逐,唯胜者得鹿而割:
    事务提交了.....
     
      刚才真不幸,在家里用一台笔记本做服务器,试着在这笔记本上运行(Compaq P4 1.6G 128M内存),第一次调用时耗时9秒左右,然后再次调用,然后就出去和朋友吃酒去了,刚回来,一个多小时了,居然还没出结果!我只好强行中断程序了。简直就是不可思议!之前,我只是修改了存储过程(不满意原来存储过程的效率),类似的存储过程有十几个,其它修改后都达到了我想要的效果,只有这一个就是不听话,真不懂为什么第一次会这么快,第二次以后就如此之慢。
      

  5.   

    to volkia(MonkeyKing) :
     我把这个存储过程直接放在SQL的查询分析器中执行的话,第一次运行用掉4秒,第2次开始就不要1秒了,我想问题不应该出在服务器上,但真不知道问题出在哪.....
      

  6.   

    搞定了。
    在做服务器的笔记本上第一次运行耗时8秒,第二次2秒,再以后就一秒都不要就可以出结果了我只是把这个AdoStroedproc删掉了,再重新放一个,重新设置了一下(和删掉的那个一样的设置)就没这怪事了。嘿嘿..不会是ADO的BUG吧。再次谢谢楼上的这些朋友!
      

  7.   

    :)来迟~不过,早来我也不知道问题所在,呵呵,,这么怪的事~~     Prepared; <---------不过,这句一般来说可以不要的吧~
         ExecProc;