DELPHI高手請進,萬分火急的問題!

gdpenghui 2013-03-02 04:14:54
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高手如雲的地方有奇跡出現,跪求了...

...全文
567 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
gdpenghui 2013-03-05
  • 打赏
  • 举报
回复
謝謝各位的幫助,我簡單的寫一下表結果. 表結構如下: (發票號) (消數日期) (消數金額) (應收金額) 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秒左右執行完成呢?
wylton 2013-03-05
  • 打赏
  • 举报
回复
你把test11 换成 +accfile。。。 靠,怎么不让我编辑??我的回复我没有权限修改??
wylton 2013-03-05
  • 打赏
  • 举报
回复
我经常看繁体字,怎么看你的繁体字我理解思路出现短路。。 呵呵 (發票號) (消數日期) (消數金額) (應收金額) 发票号 支付日期 支付金额 原有账目金额 ar_tran vouch_d payamnt ttlamnt SQL.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; ' 一句话可以解决的事,不需要那么大的动作。
simonhehe 2013-03-04
  • 打赏
  • 举报
回复
引用 楼主 gdpenghui 的回复:
ADOQuery1.Close ; ADOQuery1.SQL.Clear ; ADOQuery1.SQL.Add('SELECT * FROM '+accfile ); ADOQuery1.Open ; jl1:=ADOQuery1.RecordCount ; for i:=1 to ……
把你的表结构, 查询条件, 要求的查询结果发上来, 看你代码的意思,查询语句写好了,处理过程半秒钟足够
wuweijian86 2013-03-04
  • 打赏
  • 举报
回复
唉,你的算法太重复了,自己梳理一下上面的算法吧。 第一,从数据库里面拿5000条数据处理,你是选择全部数据的,不是以聚集索引里作为条件筛选,所以索引是暂时用不上的 第二,你只是从accfile 这个表里面汇总数据出来,按照你的意思,你只是把数据都汇总到一个变量里面fsettle,不晓得这个是不是你的真实意思,但mssql里面本身就有很多汇总数据的方法,用不着循环 第三,你循环的是存储过程,五千次来回调用存储过程,你觉得会快吗 第四,DBE,你都说是本地的数据来的,速度当然快了 第五,上面纯粹是谬论
山东蓝鸟贵薪 2013-03-03
  • 打赏
  • 举报
回复
可能是程序问题吧,没有传递信息吧
wylton 2013-03-03
  • 打赏
  • 举报
回复
你把ado换成unidac试试。
gdpenghui 2013-03-02
  • 打赏
  • 举报
回复
因為ACCFILE數據表中有很多重復而且不在時間段內的數據,所以這個循環的作用主要是統計ACCFILE數據庫中AR_TRAN這個編號符合條件數據的總和.現在主要是問題是不明白在5000條記錄的表中,循環5000次競然使用了15秒,這麼高級的SQL數據庫的查詢速度比我原來用BDE的還慢很多,用BDE數據庫同樣語句才用了1秒,因為BDE不支持網絡讀取,所以現在公司將程序改成MSSQL,但是一開始就遇到這種問題,難道真的MSQL不及BDE單機數據庫?
wylton 2013-03-02
  • 打赏
  • 举报
回复
SELECT * FROM '+accfile ('select vouch_d,payamnt from '+@accfile+' where ar_tran=''+@artran+''') 根本可以在一个语句中获得 fsettle:=fsettle+ADOStoredProc1.fieldbyname('payamnt').asfloat; 干嘛要做的怎么复杂??
wylton 2013-03-02
  • 打赏
  • 举报
回复
结帖率:33.33%.... 理论上讲只要1秒钟。 你的存儲過程用的。。。
zhuode_001 2013-03-02
  • 打赏
  • 举报
回复
是你这循环的问题吧??

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧