線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1616
推到 Plurk!
推到 Facebook!

如何提高BDE操作TABLE的速度?

答題得分者是:Justmade
viery
一般會員


發表:19
回覆:11
積分:6
註冊:2002-09-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-21 11:22:02 IP:61.170.xxx.xxx 未訂閱
我在使用BDE TABLE的时候, 当有几百条记录的时候, 速度会特别慢,要接近30S. for i = 0 Table1.Append; ...... ...... Table1.post; next; 如何优化?
chih
版主


發表:48
回覆:1186
積分:639
註冊:2002-04-02

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-03-21 11:35:30 IP:211.74.xxx.xxx 未訂閱
var j:integer; begin j:=1; for i = 0 Table1.Append; ...... ...... if j MOD 500=0 then //加上這句 500筆才post一次,應該可以改善狀況..實際要多少筆psot一次你可以自己Try出你需要的 ... Table1.post; j:=j 1; next; end; TRY TRY SEE
T.J.B
版主


發表:29
回覆:532
積分:497
註冊:2002-08-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-03-21 11:45:07 IP:61.220.xxx.xxx 未訂閱
基本上 如果只是幾百筆記錄的話 以目前的資料庫而言 應該不需要那麼久 可能有別的原因 不過就你post上來的程式來看 建議你 迴圈的裡面直接用SQL來做 不要用delphi語法做 這樣會很快 天行健 君子當自強不息~~@.@
------
天行健
君子當自強不息~~@.@
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-03-21 11:49:03 IP:218.16.xxx.xxx 未訂閱
即使你不 post 到下一個 insert 時也會自動 post 的啊 Post 是針對單一記錄的,不可能在不 post/cancel 的情況下進到另一記錄的。 另在不斷的insert裡,Next; 是完全沒需要的。 你的Table1 是否有連結到 DataSources 再連到感知元件呢(尤其是 DBGrid),若是的話 Table1.DisableControls For... begin ... ... end Table1.EnableControls 會有幫助。 另若 Table1 有很多 Detail table 時,亦可先除掉這些關係 insert 後再加回。 由於你的資料不是很充足所以很難給更多建議,你可以 post 多一點相關資料。
viery
一般會員


發表:19
回覆:11
積分:6
註冊:2002-09-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-03-21 14:54:13 IP:61.170.xxx.xxx 未訂閱
CHIH, 如每次APPEND会自动POST,所以这样设定没有用; T.J.B, 想问一下,直接用SQL的方法怎么处理? 不用BDE的QUERY组件? 能简单说明一下吗? JustMade,你的办法很不错.我现在已经可以很快取到数据.但想问一下还可以优化吗? 首先我说一下现在我的用法. query1,table1,table1通过datasource1连接到dbGrid1上 1, 首先我用query1查询得到数据; 2, table1.open; table1.DisableControls; while not query1.eof do begin table1.append; table1.fieldByName('field1').AsString := query1.fieldByName('field1').AsString; ...... table1.post; query1.next; end; table1.EnableControls;
chih
版主


發表:48
回覆:1186
積分:639
註冊:2002-04-02

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-03-21 15:12:14 IP:211.74.xxx.xxx 未訂閱
var j:integer; table1.open; table1.DisableControls; while not query1.eof do begin table1.append; table1.fieldByName('field1').AsString := query1.fieldByName('field1').AsString; ...... if j MOD 500=0 then //加上這句還是有效...你可以試看看.. table1.post; query1.next; j:=j 1; end; table1.EnableControls;
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-03-21 15:28:02 IP:218.16.xxx.xxx 未訂閱
更好的方法就是使用 sql Table1.Active := false; Query1.SQL.Text := 'insert into table1 select * from table2' Query1.Execute; Table1.Active := true; 就將所有Table2 的資料加入到 Table1 了。 當然 select * from table2 應換成你 Query1 的 SQL 若你兩個 Table 的格式是不一樣的,也可以用 insert into table1 (ItemNumber,ItemName,Price) select ItemNumber, ItemName, Price from table2 where Price > 10 等等。
T.J.B
版主


發表:29
回覆:532
積分:497
註冊:2002-08-14

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-03-21 16:06:31 IP:61.220.xxx.xxx 未訂閱
直接用SQL的方法怎么处理 ==>就是用SQL的INSERT INTO 語法ㄚ 不用BDE的QUERY组件==> 用兩個query來做 第2個query就是代替你原先的table元件

query2.DisableControls;
query2.first;
while not query2.eof do
begin  
  query1.close;  
  query1.SQL.clear;  
  query1.SQL.add(' insert into aaa(empno,ename,eaddress,empphone) ');  
  query1.SQL.Add(' VALUES (''' query2.fieldbyname('empno').asstring ''',' )  ;  
  query1.SQL.Add(' ''' query2.fieldbyname('empname').asstring ''',' )  ;  
  query1.SQL.Add(' ''' query2.fieldbyname('eaddress').asstring ''',' )   ;  
  query1.SQL.Add(' ''' query2.fieldbyname('empphone').asstring ''')' )   ;  
  query1.ExecSQL ;  
  query2.next;
end; 
query2.close;  <==
query2.open;   <== (此兩行一定要加 不然你會看不到insert進來的資料)
query2.EnableControls;    
ps: aaa 就是你原先table要append進去的tablename (是資料庫的tablename 不是你table元件的tablename) 天行健 君子當自強不息~~@.@
------
天行健
君子當自強不息~~@.@
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-03-21 16:08:31 IP:218.16.xxx.xxx 未訂閱
TJB 版主....對 Paradox / dBase 來說,我肯定你這方法比 insert / post 慢一倍以上,在DBMS也應比 insert / post 慢,因為 1. 每次改變 SQL.Text Query 元件都會做一次句法檢查,所以你 Add 5 次就做 5 次囉。 2. 每次執行是因為句法不同,每次都重新 allocate resources 去執行,很浪費。 若用 Params 可解決上述兩點。 更好的是將所有的記錄合成一句 update SQL 最後一次過執行就會更快了。可參考 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=27177。 不過,始終應是 'insert into table1 select * from table2' 最快罷?
系統時間:2024-06-24 19:51:41
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!