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

匯入資料表之效能問題

尚未結案
Paicaso
中階會員


發表:140
回覆:124
積分:52
註冊:2002-09-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-05-05 02:04:17 IP:61.59.xxx.xxx 未訂閱
我有二資料檔(分別為Access&FoxPro),從Access Import to FoxPro 我用ODBC作資料庫連結,我的程式程序如下(因版面僅大概陳述) 其中約有5個資料表,每個資料表又約20~30個欄位 在執行時其速度有點慢,如果資料筆數在100筆內也都能成功轉入, 但當資料在超過300筆時會出現錯誤,但還是能轉入, 另外如果程式執行個幾次整個速度也會變得很慢,甚至出現錯誤 好像記憶體資源用得蠻重的 可幫我看看嗎 主程式 Query1.First; While not Query1.Eof do Begin L_sp1 := Trim(QUERY1.FieldByName('sp_1').AsString); 約20~30筆資料 . . . Trans_sp(L_sp1,L_sp2,....); // //(2)開啟第二連結檔(明細)=================================================== QUERY2.SQL.Clear; QUERY2.SQL.Add('SELECT * FROM B '); QUERY2.SQL.Add('WHERE sd1 = ''' L_sp1 ''' '); QUERY2.SQL.Add('order by sd_1 '); QUERY2.CLOSE; QUERY.2OPEN; Query2.First; While not Query2.Eof do Begin L_sd2 := Trim(QUERY2.FieldByName('sd2').AsString); . . . Trans_sd(L_sd1,L_sd2,....);// Query2.Next; END; Query1.Next; END; ------------------------------------------------------------ 副程式 Procedure Trans_sp(L_sp1,L_sp2,....); Query.SQL.Clear; Query.SQL.Add('INSERT INTO sp '); Query.SQL.Add('( sp1 ,'); . . Query.SQL.Add(' sp2 )'); Query.SQL.Add(' Values '); Query.SQL.Add('(:sp1, '); . . Query.SQL.Add(':sp2 ) '); Query.ParamByName('sp_class').AsString := L_sp1; . . . try Query.ExecSQL; except ShowMessage('交易資料轉入失敗! 代碼:00A001'); end;
Justmade
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-05-05 08:13:59 IP:218.16.xxx.xxx 未訂閱
1. SQL.Clear - SQL.ADD - SQL.ADD .... 效能比直接 SQL.Text := XX YYY ZZZ 差很多倍,因為你每次已奱 SQL 都會重新檢查 SQL 語法所以 Clear 加 Add 9 次便檢查 SQL 10 次。 2. 每筆記錄Append 1 次效率不同,建議用一個字串記著要更新的 Values 一次過 (若資料太多可分批次)Update。 3. 其實用 TTable.Insert, Post 效能不太差,最少比你現在的好。 可參考 : http://delphi.ktop.com.tw/topic.php?TOPIC_ID=27177 該發問者改善作法後處理時間由原先的3分鐘改善到10秒。
wnhoo
高階會員


發表:75
回覆:443
積分:198
註冊:2003-04-22

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-05-05 11:11:08 IP:61.155.xxx.xxx 未訂閱
//ADO数据批量移动 tablesource,tabletarget》》》表名 mode为1,[便于扩展的无效参数]    procedure movedate( connsource,conntarget:tadoconnection; tablesource,tabletarget:string;mode:byte); var tablesource_tmp,tabletarget_tmp:tadotable; i:integer; begin tablesource_tmp:=tadotable.Create(nil); tabletarget_tmp:=tadotable.Create(nil);    tablesource_tmp.Connection := connsource; tablesource_tmp.TableName :=trim(tablesource); tabletarget_tmp.Connection := conntarget; tabletarget_tmp.TableName :=trim(tabletarget); try  tablesource_tmp.Active:=true;  tabletarget_tmp.Active :=true; except  tablesource_tmp.Free ;  tabletarget_tmp.Free ;    end;    try while not tabletarget_tmp.Eof do begin      tablesource_tmp.Append ;      for i:=0 to tabletarget_tmp.FieldCount-1 do      tablesource_tmp.Fields [i].Value :=tabletarget_tmp.Fields [i].Value;      try           tablesource_tmp.Post ;      except           tablesource_tmp.Cancel ;         end; tabletarget_tmp.Next ; end; except end; tablesource_tmp.Free ; tabletarget_tmp.Free ; end;    风花雪月 e梦情缘
------
风花雪月 e梦情缘
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-05-05 22:44:26 IP:218.32.xxx.xxx 未訂閱
1. odbc 效能本來就不怎樣. 2. 可以考慮運用 BatchMove 元件. 有問題再 po
wnhoo
高階會員


發表:75
回覆:443
積分:198
註冊:2003-04-22

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-05-06 13:17:21 IP:61.155.xxx.xxx 未訂閱
我上面的ADO数据批量移动的方法,功能和BDE的batchmove功能相仿。 我在 简体KTOP浏览工具中的数据汇总就是用上面功能函数实现的,速度很快的。 风花雪月 e梦情缘
------
风花雪月 e梦情缘
Paicaso
中階會員


發表:140
回覆:124
積分:52
註冊:2002-09-04

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-05-06 13:33:36 IP:61.59.xxx.xxx 未訂閱
謝謝各位先進的指點 1.主要是否因SQL.ADD - SQL.ADD .... 都會重新檢查SQL語法所以當資料量一大速度便會變嫚 所以我將格式改為 var SQL : String; Begin Query1.SQL.Clear;         SQL := 'INSERT INTO sslip  ';         SQL := SQL + '( sp1 ,sp2 ... )';         SQL := SQL + ' Values ';         SQL := SQL + '( :sp1 ,:sp2.....)'; Query1.SQL.Text := SQL; Query.ParamByName('sp1').AsString := L_sp1; . . .    try Query1.ExecSQL; except ShowMessage('交易資料轉入失敗! 代碼:00A001'); end; 經改過後速度也許有比較快,但不式很明顯,且我用了約300筆資料作測試還是會出現錯誤,如果資料用100筆則不會.    2.是否是因為用ODBC之關係,因本來我想因兩邊之資料庫不同,所以先將資料庫設定成ODBC之連結,我再以Database & Query元件比較快,誠如Justmade & Mickey兄所言,用Table & ODBC效能不佳?    3.另我也忘了說明,我的主資料料表下有關聯4個資料表,是否也因為此四個循環寫入之關係    錯誤訊息:
wnhoo
高階會員


發表:75
回覆:443
積分:198
註冊:2003-04-22

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-05-06 13:51:02 IP:61.155.xxx.xxx 未訂閱
1.你如果用BDE,那就用BATCHMOVE控件实现 2.如果用ADO,那你就用我上面的写出ADO数据批量移动的过程就可以了。    BDE的BATCHMOVE参考如下:      batchmove11.Destination :=table1;   batchmove11.Source :=query1;   batchmove11.Mappings.add('gh=gh');   batchmove11.Mappings.Add('xm=xm');   batchmove11.Mappings.Add('xb=xb');   batchmove11.Mappings.Add('csrq=csrq');   batchmove11.Mappings.Add('bmmc=bmmc');   batchmove11.Mappings.Add('bmdm=bmdm');   batchmove11.Mappings.Add('bzdm=bzdm');   batchmove11.Mappings.Add('bzmc=bzmc');   batchmove11.Mappings.Add('jszcdm=jszcdm');   batchmove11.Mappings.Add('jszc=jszc');   batchmove11.Mappings.Add('zzmm=zzmm');   batchmove11.Mappings.Add('zzmmdm=zzmmdm');   batchmove11.Mappings.Add('cjgzsj=cjgzsj');   batchmove11.Mappings.Add('gwmcdm=gwmcdm');   batchmove11.Mappings.Add('gwmc=gwmc');   batchmove11.Mappings.Add('zj=zj');   batchmove11.Mappings.Add('zjmc=zjmc');   batchmove11.Mappings.Add('yyxl=xl');   batchmove11.Mappings.Add('yyxldm=xldm');   batchmove11.Execute;    风花雪月 e梦情缘
------
风花雪月 e梦情缘
系統時間:2024-07-02 3:27:22
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!