全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1133
推到 Plurk!
推到 Facebook!

如何避免ADOQuery吃掉大量記憶體, 提昇效能

尚未結案
arliang
一般會員


發表:2
回覆:9
積分:2
註冊:2002-06-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-06-24 13:48:47 IP:61.222.xxx.xxx 未訂閱
我利用ADO元件達成異種資料庫之間複製, 假設從ADOQ1 copy ADOQ2 某一table的容量太大了(也就是ADOQ1), 有25萬筆資料, 程式如下 ADOQ1.SQL.Text := 'select * FROM ' FMoveTable ' '; ADOQ1.Open; ADOQ1.First; while not ADOQ1.eof do begin AddRec(); ADOQ1.next; end; procedure AddRec(); var i:integer; begin ADOQ2.Close; ADOQ2.SQL.Clear; ADOQ2.SQL.Text := 'select * FROM ' FMoveTable ' where 1 = 0 '; ADOQ2.Open; ADOQ2.Insert; for i:=0 to ADOQ1.FieldCount-1 do ADOQ2.Fields.FieldByName(ADOQ1.Fields.Fields[i].FieldName).Value := ADOQ1.Fields.Fields[i].Value; ADOQ2.Post; end; 程式一執行就, ADOQ1就吃掉64M byte, 請問大大該如何改善? 另外ADOQ2如果改為Table元件, 那情況會更慘 程海無涯, 回頭是岸 ~~喔咪頭佛~~
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-06-24 14:05:28 IP:203.95.xxx.xxx 未訂閱
請問是要資料表複製嗎? 可以使用 batchmove 元件或是使用 MSSQL 的 DTS 皆可達成你要的功能. 另外可否說明一下你的資料庫種類?
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-06-24 14:07:07 IP:147.8.xxx.xxx 未訂閱
Could you use select into as the SQL statement?
arliang
一般會員


發表:2
回覆:9
積分:2
註冊:2002-06-24

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-06-24 14:12:26 IP:61.222.xxx.xxx 未訂閱
引言: 請問是要資料表複製嗎? 可以使用 batchmove 元件或是使用 MSSQL 的 DTS 皆可達成你要的功能. 另外可否說明一下你的資料庫種類?
我這次要把access copyTO MySQL , 下次也許是mySQL CopyTO MSSQL, 這可不一定喔
arliang
一般會員


發表:2
回覆:9
積分:2
註冊:2002-06-24

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-06-24 14:17:46 IP:61.222.xxx.xxx 未訂閱
引言: Could you use select into as the SQL statement?
由於是異種資料庫, 所以少用SQL語法為佳, 以免發生程式裡用MSSQL的SQL語法卻不能用在MySQL DataBase身上, 或是程式裡用MySQL的SQL語法卻不能用在MSSQL DataBase
peipei36
一般會員


發表:8
回覆:51
積分:16
註冊:2002-03-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-06-26 04:39:37 IP:220.137.xxx.xxx 未訂閱
我覺得您可以試試timhuang 的方式 即使以您目前的作法 考慮速度 可能也不需要每一筆去call AddRec() (直接內嵌在loop內..) 另外 ADOQ2 的close,sql重設,open 也應在一開始做一次就好了
arliang
一般會員


發表:2
回覆:9
積分:2
註冊:2002-06-24

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-07-07 09:39:25 IP:61.222.xxx.xxx 未訂閱
引言: 我覺得您可以試試timhuang 的方式 即使以您目前的作法 考慮速度 可能也不需要每一筆去call AddRec() (直接內嵌在loop內..) 另外 ADOQ2 的close,sql重設,open 也應在一開始做一次就好了
是的!!我後來有把ADOQ2 的close,sql重設,open移到程式的開頭去做, 不要在迴圈裡做, 在效能及記憶體都有改善, 但是改善幅度不大, 另外我確實要每一筆資料都要AddRec 發表人 - arliang 於 2004/07/07 09:41:44
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-07-07 11:04:30 IP:210.65.xxx.xxx 未訂閱
Hi arliang,    我也是比較 Prefer  timhuang 大大的 Solution,不管你的資料庫資料移轉是屬常態或非常態性    若是要由 Delphi 來作,可以考慮 1.將 ADOQ1 的資料分開,例如以某一欄位值將資料區分為數種,再依序開啟ADOQ1 並新增至另一個資料庫中 2.ADOQ2 採用批次更新,請參可以下文章,或自行搜尋一下 KTop http://delphi.ktop.com.tw/topic.php?topic_id=30530 3.先進行 ADOQ1.DisableControls; ADOQ2.DisableControls; 待全部資料處理完後,再 ADOQ1.EnableControls; ADOQ2.EnableControls; ---------------------------------- 小弟才疏學淺,若有謬誤尚請不吝指教 ----------------------------------
------
Fishman
系統時間:2024-07-03 6:34:55
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!