ADOQuery1.Close ;
      ADOQuery1.SQL.Clear ;
      ADOQuery1.SQL.Add('SELECT *  FROM  '+accfile );
      ADOQuery1.Open ;
      jl1:=ADOQuery1.RecordCount ;
      for i:=1 to jl1 do
      begin
      strtran:=ADOQuery1.fieldbyname('ar_tran').asstring;         ADOStoredProc1.ProcedureName :='Sp_acct16b';
       ADOStoredProc1.Parameters.Clear ;
       ADOStoredProc1.Parameters.Refresh ;
       ADOStoredProc1.Parameters.ParamByName('@artran').Value :=trim(strtran);
       ADOStoredProc1.Parameters.ParamByName('@accfile').Value :=trim(accfile);
       ADOStoredProc1.Prepared ;
       ADOStoredProc1.Open  ;
       jl2:=ADOStoredProc1.RecordCount;       for j:=1 to jl2 do
       begin       if (ADOStoredProc1.fieldbyname('vouch_d').asfloat <=fsetdate) Then
       begin
       fsettle:=fsettle+ADOStoredProc1.fieldbyname('payamnt').asfloat;
       end;       ADOStoredProc1.Next;
       end;      ADOQuery1.Next;
      End;
   
    SQL簡單的存儲過程如下:
  ALTER procedure [dbo].[Sp_acct16b]
   @artran char(15),
   @accfile varchar(15)
   as
   begin
   exec('select vouch_d,payamnt from '+@accfile+' where ar_tran=''+@artran+''')
   end以上數據庫(ACCFILE)數據庫裡面只有5000條記錄,而且只有三個字段,為什麼DELPHI用以上查詢語句執行一次後,需要15秒左右這么久的時間才執行完呢?我已將數據庫的AR_TRAN字段做聚集索引.我使用的是SQL SERVER 2005企業版+WINDOWS 2008 R2,硬件是16G內存加至強CPU,硬件上面應該沒問題...請問各位高手是否可以讓以上程序查詢時間縮短至2秒左右執行完成呢?已經發了很多個論壇,都無人可以解決,希望在這CSDN高手如雲的地方有奇跡出現,跪求了...

解决方案 »

  1.   

    SELECT *  FROM  '+accfile('select vouch_d,payamnt from '+@accfile+' where ar_tran=''+@artran+''')根本可以在一个语句中获得
     fsettle:=fsettle+ADOStoredProc1.fieldbyname('payamnt').asfloat;干嘛要做的怎么复杂??
      

  2.   

    唉,你的算法太重复了,自己梳理一下上面的算法吧。
    第一,从数据库里面拿5000条数据处理,你是选择全部数据的,不是以聚集索引里作为条件筛选,所以索引是暂时用不上的
    第二,你只是从accfile 这个表里面汇总数据出来,按照你的意思,你只是把数据都汇总到一个变量里面fsettle,不晓得这个是不是你的真实意思,但mssql里面本身就有很多汇总数据的方法,用不着循环
    第三,你循环的是存储过程,五千次来回调用存储过程,你觉得会快吗
    第四,DBE,你都说是本地的数据来的,速度当然快了
    第五,上面纯粹是谬论
      

  3.   

    謝謝各位的幫助,我簡單的寫一下表結果.
    表結構如下:
    (發票號)     (消數日期)         (消數金額)     (應收金額)
    ar_tran       vouch_d            payamnt        ttlamnt
    I1301001      41275(整數型日期)   100.00        100.00
    I1301002      41276              2500.00       3000.00
    I1301002      41280               300.00       3000.00
    I1301002      41285               100.00       3000.00
    I1301002      41288               100.00       3000.00
    I1301003      41276               900.00       1000.00
    I1301004      41275               500.00        500.00
    ...........
    數據表一共有5000條記錄,實際這是個簡單的會計消數記錄表,因為一個發票客戶有可能幾次給錢,我做的報表主要目的是統計一個日期之前(例如41280(20130106)),列表顯示每個發票號還有多少錢未收.數據表已對ar_tran(發票號進行了聚集索引).
    就以上幾條數據為例 ,顯示20130106日前的結果為:
    I1301002   200.00
    I1301003   100.00
    我採用的方法是上面所述的循環方法,5000條記錄耗時15秒出結果,不知各位高手是否有其它方法,可以讓程序1秒左右執行完成呢?
      

  4.   

    我经常看繁体字,怎么看你的繁体字我理解思路出现短路。。
    呵呵
    (發票號)     (消數日期)         (消數金額)     (應收金額)
    发票号        支付日期           支付金额      原有账目金额
    ar_tran       vouch_d            payamnt        ttlamntSQL.txt='select ar_tran, sum(payamnt), ttlamnt,  ttlamnt-sum(payamnt) as debido from  test11 where vouch_d <=41280 group by ar_tran; '或者
    SQL.txt='select ar_tran, debido from (select ar_tran, sum(payamnt), ttlamnt,  ttlamnt-sum(payamnt) as debido from  test11 where vouch_d <=41280 group by ar_tran) as t1 where debido<>0; '一句话可以解决的事,不需要那么大的动作。
      

  5.   

    你把test11 换成 +accfile靠,怎么不让我编辑??我的回复我没有权限修改??