2011-01-21 10 views
0

私は3つのデータフィールドを持つ簡単なinsert文を持っています。 プライマリキーで自動インクリメントではないTag_ID 簡単なDateTime Nowを文字列として保存するタイムスタンプ、および単純な除算計算を含むfloat値。ms sql lazarusでパフォーマンスを向上させる

実際にはSQL Serverはローカルですが、後でローカルネットワークにない別のマシンに置かれます。今私は10.000のエントリのための25,8秒を得る..どのように私はこれを改善することができますか?

私のコードは次のようになります。

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

を挿入します。 代わりに、あなたはあなたが一致するSPを変更する必要があり、一度

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) 

でバッチ全体を挿入するストアドプロシージャにその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を作成することができます使用しているデータ型に関係なく 私はこれがあなたがやっているより速いと信じていますが、自分でそれをテストするようなものはありません。

+1

バッチ処理を望むもう一つの理由は、すべての個々の 'commit'ステートメントが物事を大幅に遅くするということです。 –

関連する問題