2011-01-21 26 views
0

我有一個簡單的插入語句與3個數據字段。 Tag_ID不是主鍵,也不是自動增量, 時間戳,它將一個簡單的DateTime現在保存爲一個字符串和一個包含簡單分離計算的浮點值。改善MS SQL與拉撒路插入性能

sql服務器實際上是本地的,但後來它將在不在本地網絡中的另一臺機器上。現在我得到25.8秒爲10.000條目..我怎麼能改善呢?

我的代碼看起來是這樣的:

procedure TForm1.testMssql(Datensaetze: integer); 
var 
    i: integer; 
    before,after,result: real; 
begin 
    before := GetTickCount; 
    for i:= 0 to Datensaetze do 
    begin 
    try 
      query.DataBase := conn; 
      query.UsePrimaryKeyAsKey:=false; 
      query.SQL.Text := 'insert into speedTest(TagID,timestamp,Value) values(:tag_id,:timestamp, :value)'; 
      query.Params.ParamByName('tag_id').AsInteger := i ; 
      query.Params.ParamByName('timestamp').AsString := DateTimeToStr(Now); 
      query.Params.ParamByName('value').AsFloat := ((i*2)/55); 
      query.ExecSQL; 
      SQLTransaction1.Commit; 
    except 
     on E: Exception do 
     ShowMessage(E.Message); 
    end; 
    end; 
    after := GetTickCount; 

    result := (after - before)/1000; 
    Memo1.Text := FloatToStr(result); 
end; 

回答

2

我想這是往返於花費時間最多的分貝。 相反,你可以創建一個XML看起來像這樣的,包括所有的行

<root> 
    <row> 
    <TagID>1</TagID> 
    <timestamp>2010-10-10T10:10:10</timestamp> 
    <value>10</value> 
    </row>  
    <row> 
    <TagID>2</TagID> 
    <timestamp>2011-11-11T11:11:11</timestamp> 
    <value>20</value> 
    </row>  
</root> 

發送該XML存儲過程,插入整批一次

create procedure InsertSpeedTest 
    @XML as xml 
as 
insert into speedTest (TagID, timestamp, Value) 
select 
    r.r.value('TagID[1]', 'int'), 
    r.r.value('timestamp[1]', 'datetime'), 
    r.r.value('value[1]', 'int') 
from @XML.nodes('root/row') r(r) 

您必須修改SP匹配無論你使用什麼數據類型。 我相信這會比你在做什麼更快,但沒有什麼比如你自己測試它。

+1

想批處理的另一個原因是所有單個`commit`語句都會顯着降低速度。 – 2011-01-21 10:32:35