MS SQL 資料庫速度 |
尚未結案
|
nick167
中階會員 發表:86 回覆:133 積分:53 註冊:2003-02-12 發送簡訊給我 |
1.設備P4 2.4 HDD 80MB(7200)
2.想測式資料庫新增[20萬筆]速度 約8分4秒
SQL語法搜尋[20萬筆]速度: 約1秒
LOCATE語法搜尋[20萬筆]速度: 約1秒
SQL與LOCATE 速度好像差不多 // 新增20筆損耗8分可以在快一點嗎?可否提供更快的寫法
(個人感覺好像慢在ADOQuery1.Last;地方)
procedure TForm1.Button1Click(Sender: TObject);
var S:String;
I:Integer;
begin
label1.Caption:='起始' TimeToStr(time);
i:=1;
while I < 10000 do begin
label3.Caption:=inttostr(i);
if ADOQuery1.Eof then
S:='0000000000'
else
begin
ADOQuery1.Last;
S:=ADOQuery1.FieldByName('tno').AsString;
end;
S:=RightStr('0000000000' (IntToStr(StrToInt(S) 1)),10);
ADOQuery2.SQL.Clear;
ADOQuery2.SQL.Add('INSERT TESTNO(TNO) VALUES (''' S ''' )');
ADOQuery2.ExecSQL;
ADOQuery2.Close;
ADOQuery1.Close;
ADOQuery1.Open;
inc(i);
end;
label2.Caption:='終止' TimeToStr(time);
end; // 刪20萬筆好快不到2秒
procedure TForm1.Button2Click(Sender: TObject);
begin
ADOQuery2.SQL.Clear;
ADOQuery2.SQL.Add('truncate TABLE TESTNO');
ADOQuery2.ExecSQL;
ADOQuery2.Close;
ADOQuery1.Close;
ADOQuery1.Open;
end; // Locate
procedure TForm1.Button3Click(Sender: TObject);
begin
label1.Caption:='起始' TimeToStr(time);
ADOQuery1.Locate('tno','0000018100',[]);
label2.Caption:='終止' TimeToStr(time);
end; // SQL
procedure TForm1.Button4Click(Sender: TObject);
begin
label1.Caption:='起始' TimeToStr(time);
ADOQUERY1.SQL.Clear;
ADOQUERY1.SQL.Add('SELECT * FROM TESTNO WHERE TNO= ''' '0000018100' ''' ');
ADOQUERY1.Active:=True;
label2.Caption:='終止' TimeToStr(time);
end; 發表人 - nick167 於 2004/03/11 11:31:28
|
chih
版主 發表:48 回覆:1186 積分:639 註冊:2002-04-02 發送簡訊給我 |
|
nick167
中階會員 發表:86 回覆:133 積分:53 註冊:2003-02-12 發送簡訊給我 |
謝謝chih版主提醒,我按button1 二次筆數應為2萬筆非20萬筆
<<我只想體驗一下資料多時 MsSQL資料庫效率>>
體驗心得:(現資料庫已新增至8萬筆,希望新增20萬筆[努力中... 在測看看]
進入 ADOQuery.Last; 蠻快不到一秒
Locate 0000078000 約一秒
使用SQL語法:SELECT * FROM TESTNO WHERE TNO= '0000078000'不到一秒
SQL 好像比較會一點
可是Append時好慢,可否有其它寫法速度快一點?是否與
ADOQuery2.ExecSQL,
ADOQuery2.Close,
ADOQuery1.Close,
ADOQuery1.Open 相關嗎? procedure TForm1.Button1Click(Sender: TObject);
var S:String;
I:Integer;
begin
label1.Caption:='起始' TimeToStr(time);
i:=1;
while I < 150000 do begin
label3.Caption:=inttostr(i);
if ADOQuery1.Eof then
S:='0000000000'
else
begin
ADOQuery1.Last;
S:=ADOQuery1.FieldByName('tno').AsString;
end;
S:=RightStr('0000000000' (IntToStr(StrToInt(S) 1)),10);
ADOQuery2.SQL.Clear;
ADOQuery2.SQL.Add('INSERT TESTNO(TNO) VALUES (''' S ''' )');
ADOQuery2.ExecSQL;
ADOQuery2.Close;
ADOQuery1.Close;
ADOQuery1.Open;
INC(I);
end;
label2.Caption:='終止' TimeToStr(time);
end;
|
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
nick167 你好
procedure TForm1.Button1Click(Sender: TObject); var S:String; I:Integer; begin label1.Caption:='啟始' TimeToStr(time); ADOQuery2.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('Select Max(tno) As Tno From TESTNO'); // 設定一次即可 For i:=0 To 149999 do begin label3.Caption:=inttostr(i); //=========== 測試 取最大值的程式段 有需求則將{}拿掉=============== { ADOQuery1.Open ; if ADOQuery1.Eof then S:='0000000000' else S:=ADOQuery1.FieldByName('tno').AsString; ADOQuery1.Close; S:=RightStr('0000000000' (IntToStr(StrToInt(S) 1)),10); } // 如果 只單純測試寫入速度用這段 =============== S:=RightStr('0000000000' (IntToStr(I 1)),10); //========================== ADOQuery2.SQL.Text :='INSERT TESTNO(TNO) VALUES (''' S ''' )';//還可以改成傳參數方式,應該可以更快 ADOQuery2.ExecSQL; INC(I); end; label2.Caption:='終止' TimeToStr(time); end; |
nick167
中階會員 發表:86 回覆:133 積分:53 註冊:2003-02-12 發送簡訊給我 |
Chance36 你好:真的快多新增100筆約1秒,用原寫法約23秒
但尚有二問題,
1.當EOF此語法無效直接取 ELSE ADOQuery1.Open ;
if ADOQuery1.Eof then
S:='0000000000'
else
S:=ADOQuery1.FieldByName('tno').AsString;
就會出現ERROR MESSAGE:IS NOT VALID INTEGER VALUE 2.
ADOQuery2.SQL.Text :='INSERT TESTNO(TNO) VALUES (''' S ''' )';//還可以改成傳參數方式,應該可以更快 不知其方法,可否告知傳參數方式,謝謝 發表人 - nick167 於 2004/03/12 10:10:09
|
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
nick167 你好
procedure TForm1.Button1Click(Sender: TObject); var S:String; I:Integer; begin label1.Caption:='啟始' TimeToStr(time); ADOQuery2.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('Select Max(tno) As Tno From TESTNO'); // 設定一次即可 ADOQuery2.SQL.Clear; ADOQuery2.SQL.Text :='INSERT TESTNO(TNO) VALUES (:pTNO )';//設定需帶入的參數 For i:=0 To 149999 do begin label3.Caption:=inttostr(i); //=========== 測試 取最大值的程式段 有需求則將{}拿掉=============== { ADOQuery1.Open ; if (ADOQuery1.Eof) or (ADOQuery1.FieldByName('tno').Value = NULL) then S:='0000000000' else S:=ADOQuery1.FieldByName('tno').AsString; ADOQuery1.Close; S:=RightStr('0000000000' (IntToStr(StrToInt(S) 1)),10); } // 如果 只單純測試寫入速度用這段 =============== S:=RightStr('0000000000' (IntToStr(I 1)),10); //========================== ADOQuery2.Parameters.ParamByName('pTNO').AsString:= S;//傳參數方式 ADOQuery2.ExecSQL; //INC(I); end; label2.Caption:='終止' TimeToStr(time); end;發表人 - chance36 於 2004/03/12 18:27:10 |
nick167
中階會員 發表:86 回覆:133 積分:53 註冊:2003-02-12 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |