ADO 如何可以在加快以下處理速度呢? |
答題得分者是:johnny2212
|
SleepWalker
一般會員 發表:16 回覆:20 積分:12 註冊:2004-06-21 發送簡訊給我 |
try
if CheckBox1.Checked then
begin
ADOQuery1.Close;
ADOQuery2.Close;
ADOQuery1.SQL.Text := 'Select * from CISRTDataTbl2 Where chDataDateTime < ' chr(39) NowTime chr(39);
ADOQuery2.SQL.Text := 'Select * from CISRTDataTbl where chDataDateTime < ' chr(39) 'Empty' chr(39);
ADOQuery1.Open;
ADOQuery2.Open;
ItemCounter := 0; StatusBar1.Panels.Items[4].Text := IntToStr(ADOQuery1.RecordCount); if ADOQuery1.RecordCount <> 0 then
begin
try
ADOConnection2.BeginTrans; for I := 1 to ADOQuery1.RecordCount do
begin
Application.ProcessMessages; if ForceExit then
begin
ADOQuery1.Close;
ADOQuery2.Close;
Exit;
end; StatusBar1.Panels.Items[2].Text := IntToStr(ADOQuery1.RecordCount); ADOQuery2.Append; for J := 0 to ADOQuery1.FieldCount - 1 do
begin
Application.ProcessMessages; if ForceExit then
begin
ADOQuery1.Close;
ADOQuery2.Close;
Exit;
end; ADOQuery2.Fields.Fields[j].AsVariant := ADOQuery1.Fields.Fields[j].AsVariant;
end; ADOQuery2.Post; ADOQuery1.Next;
Inc(ItemCounter);
end; ADOConnection2.CommitTrans;
except
ADOConnection2.RollbackTrans;
end;
end; StatusBar1.Panels.Items[2].Text := '0';
StatusBar1.Panels.Items[4].Text := '0';
ADOQuery1.Close;
ADOQuery2.Close; ADOQuery1.SQL.Text := 'Delete from CISRTDataTbl2 Where chDataDateTime < ' chr(39) NowTime chr(39);
ADOQuery1.ExecSQL;
end;
except
Memo1.Lines.Add(LogTime ' - ' 'Error 167');
end; try
ADOConnection1.Close;
ADOConnection2.Close;
except
Memo1.Lines.Add(LogTime ' - ' 'Error 174');
Exit;
end;
|
peipei36
一般會員 發表:8 回覆:51 積分:16 註冊:2002-03-13 發送簡訊給我 |
|
johnny2212
初階會員 發表:34 回覆:65 積分:39 註冊:2003-04-09 發送簡訊給我 |
我大概看了一下你的程式,主要影響速度的應該是"轉檔"這兩行 // ADOQuery2.Fields.Fields[j].AsVariant := ADOQuery1.Fields.Fields[j].AsVariant;
// ADOQuery2.post 您希望加快速度,我必須告訴你,一但你使用了資料庫交易,資料庫就會做
Record lock 或是會做Table lock,速度一定會變慢,這是沒辦法的事,針對你的程式我提出以下幾個建議: 1 你既然使用了Application.ProcessMessage 代表你是要考慮Client端的執行時間和感受,你可改用StoreProcedure,因為Client端一但呼叫完成後會分離,後續由Database自己去做,就算速度非常慢,Client端也感覺不出來(ExecuteSql 不會傳回值),缺點就是不同的資料庫有不同的語法,不論學習或移植的確比較麻煩 2 將你以上的程式改成Thread,TADOQuery 放入DataModule中,不要放在Form上,由Thread 動態Creat DataModule,只要你的Application 沒有Termate掉(就算單一的Form關掉),程式還是會放入BackGround中一直執行,但有一定的危險(如Client端發生問題或突然中斷) 3 使用Multi-tier,按照上述的方式,由AP獨立去運作,這樣當然是最理想的方法,Client關掉程式,也不會影響AP的運作,我都是用這種做法,但前提你必須會多層次結構 4 將資料一筆一筆insert至資料庫,但是要使用bulk insert(在SQL Server中),你可以自己看SqlServer help,這樣速度應該是最快的(書上說的),在StoreProcedure中應該也可以使用,交易的部分(Transaction)一樣傳入SQL指令,不過我沒有這樣用過,有興趣不妨試看看,別忘了告訴我結果
|
SleepWalker
一般會員 發表:16 回覆:20 積分:12 註冊:2004-06-21 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |