程式效率一問....><~~急! |
尚未結案
|
isthatu
初階會員 發表:80 回覆:47 積分:25 註冊:2002-06-26 發送簡訊給我 |
請教一下各位
下列一段程式 是將TABLE A清空後 將TABLE B資料新增到TABLE A 他在PARADOX的效率 TABLE B 7000比資料 約不到2秒完成 (我看到都嚇一跳)
在ACCESS居然高達 1分04秒 不曉得是原因?怎麼效率會差那麼多 --------------------------------------------------
TempTable1 := TTable.Create(Self);
TempTable2 := TTable.Create(Self);
try
TempTable1.DatabaseName := 'dbase';
TempTable2.DatabaseName := 'dbase';
TempTable1.TableName := 'A.DB';
TempTable2.TableName := 'B.DB';
TempTable1.Open;
TempTable2.Open;
While not TempTable1.IsEmpty do
TempTable1.Delete; I := 0;
TempTable2.First;
While not TempTable2.Eof do
begin
TempTable1.Append;
TempTable1.FieldValues['INDEX'] := I;
TempTable1.FieldValues['MBA01'] := TempTable2.FieldValues['MBA01'];
TempTable1.FieldValues['MBA02'] := TempTable2.FieldValues['MBA02'];
TempTable1.FieldValues['MBA03'] := TempTable2.FieldValues['MBA03'];
TempTable1.FieldValues['MBA04'] := TempTable2.FieldValues['MBA04'];
TempTable1.FieldValues['MBA05'] := TempTable2.FieldValues['MBA05'];
TempTable1.Post;
Inc(I);
TempTable2.Next;
end;
finally
TempTable1.Close;
TempTable2.Close;
TempTable1.Free;
TempTable2.Free;
end; ------------------------------------------------------------------ 後來 我換成QUERY 換成下列程式碼 測試ACCESS 效率一樣很差
與PARADOX兩秒的速度還是天壤之別 --------------------------------------------------------------------
dbase1.Connected:=false;
dbase1.AliasName:='ODBC1';
Tempqy1:=Tquery.Create(self);
Tempqy2:=Tquery.Create(self);
Tempqy2.DatabaseName:='Dbase';
Tempqy1.DatabaseName:='Dbase';
Tempqy1.RequestLive:=true;
Tempqy1.CachedUpdates:=true;
Tempqy2.close;
Tempqy2.SQL.Clear;
Tempqy2.SQL.Add('select * from B ');
Tempqy2.Open;
tempqy2.First;
Tempqy1.Close;
Tempqy1.SQL.Clear;
Tempqy1.SQL.Add('delete from A ');
Tempqy1.ExecSQL;
Tempqy1.Close;
Tempqy1.SQL.Clear;
Tempqy1.SQL.Add('select * from A ');
Tempqy1.open;
I:=0;
try
t0:=now;
while not tempqy2.eof do begin
try
tempqy1.Append;
tempqy1['INDE_']:=I;
tempqy1['MBA01']:=tempqy2['MBA01'];
tempqy1['MBA02']:=tempqy2['MBA02'];
tempqy1['MBA03']:=tempqy2['MBA03'];
tempqy1['MBA04']:=tempqy2['MBA04'];
tempqy1['MBA05']:=tempqy2['MBA05'];
tempqy1['MBA21']:=tempqy2['MBA21'];
tempqy1['MBA77']:=tempqy2['MBA77'];
tempqy1['MBA78']:=tempqy2['MBA78'];
tempqy1['MBA79']:=tempqy2['MBA79'];
tempqy1['MBA80'] :=tempqy2['MBA80'];
tempqy1.POST;
tempqy2.Next;
inc(i);
except
end;
end;
finally
tempqy1.ApplyUpdates;
tempqy1.Close;
tempqy2.Close;
tempqy1.Free;
tempqy2.Free;
end; -------------------------------------------------------------------- 最後QUERY新增 我用(INSERT A(1,3,4...)Values(:1,:2,:3..) 的語法
還是一樣很差 其實7000比資料新增...速度上1分鐘左右 我不會意外
只是PARADOX新增資料可以兩秒 令我我太震驚了...... 原本要將PARADOX換成ACCESS 結果部分效率提升不少 卻在這裡讓我卡住了
怎麼都沒辦法修正讓ACCESS效率提升 變得有一好 就有一壞.... 不曉得各位 有沒啥看法與建議! 或者你也可以測看看!! BCDEFHIJKLMNOPQRSTUVWXZ
------
BCDEFHIJKLMNOPQRSTUVWXZ |
yachanga
資深會員 發表:24 回覆:335 積分:296 註冊:2003-09-27 發送簡訊給我 |
|
isthatu
初階會員 發表:80 回覆:47 積分:25 註冊:2002-06-26 發送簡訊給我 |
引言: Hi 您可以從幾個方向嘗試看看 1. 調整SQL 語法 Select 加Index是好做法. 以您的例子, INSERT 方法改用SQL 試一下BCDEFHIJKLMNOPQRSTUVWXZQuery1.sql.text:='DELETE A'; Query.ExecSQL; Query1.sql.text:='INSERT A SELECT * FROM B'; Query.ExecSQL;這方法有想過 不過insert a要再另加一個欄位值i 不是全然的將table b灌到 table a 所以又行不通 不知道access是否欄位自動給號方式 如果可以這樣設定 就可以 用上述方法 2. 調整BDE 設定值 可直接進入BDEADMIN 去調大參數看看有沒有差異 好像好沒啥影響....真慘... ~悠遊法國號~ 發表人 - yachanga 於 2004/04/08 08:57:27
------
BCDEFHIJKLMNOPQRSTUVWXZ |
bestlong
站務副站長 發表:126 回覆:734 積分:512 註冊:2002-10-19 發送簡訊給我 |
|
isthatu
初階會員 發表:80 回覆:47 積分:25 註冊:2002-06-26 發送簡訊給我 |
|
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |