匯入資料表之效能問題 |
尚未結案
|
Paicaso
中階會員 發表:140 回覆:124 積分:52 註冊:2002-09-04 發送簡訊給我 |
我有二資料檔(分別為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 發送簡訊給我 |
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 發送簡訊給我 |
//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 發送簡訊給我 |
|
wnhoo
高階會員 發表:75 回覆:443 積分:198 註冊:2003-04-22 發送簡訊給我 |
|
Paicaso
中階會員 發表:140 回覆:124 積分:52 註冊:2002-09-04 發送簡訊給我 |
謝謝各位先進的指點
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 發送簡訊給我 |
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梦情缘 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |