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

程式效率一問....><~~急!

尚未結案
isthatu
初階會員


發表:80
回覆:47
積分:25
註冊:2002-06-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-04-07 22:39:42 IP:61.64.xxx.xxx 未訂閱
請教一下各位 下列一段程式 是將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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-04-07 23:07:32 IP:61.230.xxx.xxx 未訂閱
或許您可以比較用SQL的效率 Query1.sql.text:='DELETE A'; Query.ExecSQL; Query1.sql.text:='INSERT A SELECT * FROM B'; Query.ExecSQL;        ~悠遊法國號~
isthatu
初階會員


發表:80
回覆:47
積分:25
註冊:2002-06-26

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-04-08 10:50:55 IP:211.20.xxx.xxx 未訂閱
引言: Hi 您可以從幾個方向嘗試看看 1. 調整SQL 語法 Select 加Index是好做法. 以您的例子, INSERT 方法改用SQL 試一下
  Query1.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
------
BCDEFHIJKLMNOPQRSTUVWXZ
bestlong
站務副站長


發表:126
回覆:734
積分:512
註冊:2002-10-19

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-04-08 12:03:03 IP:211.22.xxx.xxx 未訂閱
如果是透過 BDE 來存取 Access 一定會比存取 Paradox 還慢的. 可以考慮使用 ADO 來連接 Access 試試. 我是雪龍
------
http://blog.bestlong.idv.tw/
http://www.bestlong.idv.tw/
http://delphi-ktop.bestlong.idv.tw/
isthatu
初階會員


發表:80
回覆:47
積分:25
註冊:2002-06-26

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-04-08 13:03:54 IP:211.20.xxx.xxx 未訂閱
引言: 如果是透過 BDE 來存取 Access 一定會比存取 Paradox 還慢的. 可以考慮使用 ADO 來連接 Access 試試. 我是雪龍
因為接到的程式當時開發的工具是delphi 4 所以沒有ado 原本用想用dbe 中access的原生驅動程式 MSaccess來連可是一直出問題 無法成功.... BCDEFHIJKLMNOPQRSTUVWXZ
------
BCDEFHIJKLMNOPQRSTUVWXZ
Mickey
版主


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-04-08 20:46:23 IP:218.32.xxx.xxx 未訂閱
如果一定需要用 BDE, 考慮用 TBatchMove 元件來搬資料, 速度可能有些幫助.
系統時間:2024-05-17 13:30:00
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!