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

MS SQL 資料庫速度

尚未結案
nick167
中階會員


發表:86
回覆:133
積分:53
註冊:2003-02-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-03-11 10:39:51 IP:61.228.xxx.xxx 未訂閱
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-03-11 12:22:07 IP:218.165.xxx.xxx 未訂閱
引言: // 新增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
你的新增好像是10,000比而不只是20筆喔??
nick167
中階會員


發表:86
回覆:133
積分:53
註冊:2003-02-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-03-11 17:56:09 IP:61.228.xxx.xxx 未訂閱
謝謝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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-03-11 18:29:28 IP:211.20.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-03-12 10:01:23 IP:61.228.xxx.xxx 未訂閱
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-03-12 18:25:15 IP:203.204.xxx.xxx 未訂閱
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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-03-15 08:57:17 IP:61.228.xxx.xxx 未訂閱
謝謝 Chance36
系統時間:2024-05-19 7:12:14
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!