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高手如雲的地方有奇跡出現,跪求了...
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高手如雲的地方有奇跡出現,跪求了...
解决方案 »
- webbrowser获取内容出现“Out of memory”?高手请进!!!!!!!!!!!!!!!!!!
- 有没有类似dbcombobox的控件,有个value属性可以绑定到数据库的字段?
- QuickReport.v5.04.D2009 安装问题
- datasource table adoquery让dbgrid显示出来数据,
- 100分求一菜鸟例程;单线程在Memo中增加100行内容。顶者有分。最迟本周日结贴。
- 帮忙想一个数据结构,合适就给分![数据结构醒目]
- 一个select语句的补充提问?????
- 一元2次方程的根的问题
- 怎样在delphi中动态创建(加载)一个ocx
- 安卓 模拟按键 点击函数,求指点用什么函数??
- 关于 not find dcu 问题
- 主表明细表的查询如何写?
fsettle:=fsettle+ADOStoredProc1.fieldbyname('payamnt').asfloat;干嘛要做的怎么复杂??
第一,从数据库里面拿5000条数据处理,你是选择全部数据的,不是以聚集索引里作为条件筛选,所以索引是暂时用不上的
第二,你只是从accfile 这个表里面汇总数据出来,按照你的意思,你只是把数据都汇总到一个变量里面fsettle,不晓得这个是不是你的真实意思,但mssql里面本身就有很多汇总数据的方法,用不着循环
第三,你循环的是存储过程,五千次来回调用存储过程,你觉得会快吗
第四,DBE,你都说是本地的数据来的,速度当然快了
第五,上面纯粹是谬论
表結構如下:
(發票號) (消數日期) (消數金額) (應收金額)
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秒左右執行完成呢?
呵呵
(發票號) (消數日期) (消數金額) (應收金額)
发票号 支付日期 支付金额 原有账目金额
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; '一句话可以解决的事,不需要那么大的动作。