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

CachedUpdates的速度隨筆數增多嚴重下降~~ >"<

尚未結案
kyxiang
一般會員


發表:8
回覆:6
積分:2
註冊:2002-03-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-01-16 17:02:34 IP:210.59.xxx.xxx 未訂閱
請教各位先進.. 我用CachedUpdates的方式將資料讀取至Client端 將其中一個欄位(假設欄位名為"FieldCheck")抓來當作勾選欄位 也就是讓user可以勾選哪些資料要進行處理 Form上有一個Button是 "全選" 的功能 程式碼如下:
  Query1.First;
  While (Not Query1.EOF) do
    begin
      Query1.Edit;
      Query1.FieldByName('FieldCheck').asString:='Y';
      Query1.Post;
 
      Query1.Next;
    end;
  Query1.First;
而今遇到一個問題 就是這個迴圈會越跑越慢 才不過幾百筆的資料 跑到後來甚至每跳一筆就要花數秒 從頭到尾全選一遍午覺都睡醒ㄌ... @@ 請教各位先進是否有辦法可以解決? 或是有沒有其他模擬勾選功能的做法? 先謝謝各位了....
chih
版主


發表:48
回覆:1186
積分:639
註冊:2002-04-02

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-01-16 17:18:15 IP:211.74.xxx.xxx 未訂閱
Query1.First; While (Not Query1.EOF) do begin Query1.Edit; Query1.FieldByName('FieldCheck').asString:='Y'; Query1.Post; Query1.ApplyUpdates;//加上這行 Query1.Next; end; Query1.First;
kyxiang
一般會員


發表:8
回覆:6
積分:2
註冊:2002-03-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-01-16 17:29:45 IP:210.59.xxx.xxx 未訂閱
如果下ApplyUpdates 那不就把資料即時異動回資料庫去了嗎? 可是如果我要等到user確定要異動資料的時候才對資料庫作異動 而且在異動的同時還會連動到好幾個資料表 所以我會下Transaction 這樣我就不能在勾選的時候就下ApplyUpdates 請問這樣又該如何解決呢?... @@
chih
版主


發表:48
回覆:1186
積分:639
註冊:2002-04-02

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-01-16 17:34:29 IP:211.74.xxx.xxx 未訂閱
以前有做過是再Query1 NEW一個欄位..比如叫做ABC 用這個欄位來記錄'Y' or 'N'. 按存檔時在跑迴圈.. Query1.First; While (Not Query1.EOF) do begin if Query1.FiledByName('ABC').Value='Y' then begin Query1.Edit; Query1.FieldByName('FieldCheck').asString:='Y'; Query1.Post; Query1.ApplyUpdates; end; Query1.Next; end; Query1.First;
引言: 如果下ApplyUpdates 那不就把資料即時異動回資料庫去了嗎? 可是如果我要等到user確定要異動資料的時候才對資料庫作異動 而且在異動的同時還會連動到好幾個資料表 所以我會下Transaction 這樣我就不能在勾選的時候就下ApplyUpdates 請問這樣又該如何解決呢?... @@
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-01-16 17:35:23 IP:203.217.xxx.xxx 未訂閱
如果query1有接向任何DBGrid, dbedit等元件的話, 更新顯示會慢下來
  query1.disableControls;
  Query1.First;  
  While (Not Query1.EOF) do begin 
    Query1.Edit; 
    Query1.FieldByName('FieldCheck').asString:='Y';    
    Query1.Post;
    Query1.Next; 
  end; 
 Query1.First;
 query1.EnableControls;
可以加快一些 不過若是跳一筆就要花數秒可能還有其中問題
kyxiang
一般會員


發表:8
回覆:6
積分:2
註冊:2002-03-11

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-01-16 21:34:03 IP:210.59.xxx.xxx 未訂閱
"每跳一筆甚至要數秒鐘" 是我描述的太誇大了點... ^^"    剛剛寫了個小程式整個測了一下 數據如下: (第一列的數據為單單post) (第二列的數據為 post & ApplyUpdates) (第三列的數據為 post & ApplyUpdates & CommitUpdates)    
   235 筆    360筆     780筆
  31.416秒  70.642秒  352.147秒     
  41.880秒  87.406秒  386.005秒     
  10.035秒  17.585秒   46.807秒     
另, 有無 DisableControls 影響大約 10% 可以看得出來ApplyUpdates之後 一定要下CommitUpdates把Buffer內資料真正清空才行 我目前的做法是在user查詢出資料時先把查出的資料放進暫存檔 然後由暫存檔把資料讀出 而User在畫面上的所有異動(包含勾選與否)都ApplyUpdates 並 Commit 算是暫時解決了這個問題 如果有各位先進有更好更有效率的辦法 也請不吝指教... 謝謝 chih 兄 與 ccchen 兄的仗義相助 小弟這裡謝過了~ ^____^
dannynet
一般會員


發表:0
回覆:2
積分:0
註冊:2002-12-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-01-17 00:46:06 IP:203.204.xxx.xxx 未訂閱
我想只有 Update 一個 Field 的 Value, 應該效率上不會這麼差,而是你在這個 Query 的其他事件又寫了會花時間的程式,你可以將這個 Query 的事件先拿掉,再試看看,應該是一瞬間就會結束的事
kyxiang
一般會員


發表:8
回覆:6
積分:2
註冊:2002-03-11

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-01-17 13:32:12 IP:210.59.xxx.xxx 未訂閱
我有想過這個可能性 所以測試的時候已經把所有事件都拿掉了 只是單單針對這個欄位作Update 還是方不方便哪位先進也願意幫我測試一下 看看這三種情況下 異動這些筆數大概要花費多少時間? 我的後端資料庫是 ORACLE 8i
chih
版主


發表:48
回覆:1186
積分:639
註冊:2002-04-02

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-01-17 22:49:48 IP:61.216.xxx.xxx 未訂閱
從你提供的數據看起來好像ORACLE 沒有調校好喔... 光是MSSQL速度也沒有這麼慢... 以前用ORACLE 時候記得也沒有這麼慢ㄋ.. 個人淺見....
引言: 我有想過這個可能性 所以測試的時候已經把所有事件都拿掉了 只是單單針對這個欄位作Update 還是方不方便哪位先進也願意幫我測試一下 看看這三種情況下 異動這些筆數大概要花費多少時間? 我的後端資料庫是 ORACLE 8i
kadee
高階會員


發表:11
回覆:141
積分:165
註冊:2002-03-20

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-01-18 13:41:57 IP:218.165.xxx.xxx 未訂閱
建議改用clientdataset可能會好一點, 若不想用MIDAS,可用kbmmemtb(momery dataset) Good luck!! Kadee_BigRed
------
Kadee/BigRed Ent.
www.tw165.com
shpeng
初階會員


發表:6
回覆:67
積分:49
註冊:2002-12-21

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-01-22 17:33:00 IP:211.72.xxx.xxx 未訂閱
procedure TForm1.Button1Click(Sender: TObject);
begin
ADODataSet1.LockType := ltBatchOptimistic;
ADODataSet1.open;
end;    procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
ADOConnection1.BeginTrans;
with ADODataSet1 do
while not eof do
begin
        edit;
        Fieldbyname('ddd').asstring := 'x';
        post;
        next;
end;
ADODataSet1.UpdateBatch;
ADOConnection1.CommitTrans;
end;
測試 8000筆 約11秒 DELPHI5 c-1000 MSSQL c-800 ==取之於斯,用之於斯== 發表人 - shpeng 於 2003/01/22 17:33:42
------
==取之於斯,用之於斯==
Mickey
版主


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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-01-27 12:17:10 IP:61.219.xxx.xxx 未訂閱
將處理程序移到後端資料庫(如 store procedure)進行處理, 應該是可以考慮的方向  /* 使用中文很辛苦,中華男兒當自強 */
系統時間:2024-06-29 0:09:27
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!