2011-01-21 3 views
0

3 개의 데이터 필드가있는 간단한 insert 문이 있습니다. 기본 키가 아니고 자동 증가가 아닌 Tag_ID, 쉬운 DateTime Now를 문자열로 저장하고 간단한 계산을 포함하는 float 값을 저장하는 타임 스탬프입니다.ms sql 삽입 성능 (나사로 포함)

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

를 삽입합니다. 대신 당신은 모든 행

<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> 

당신은 일치하도록 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을 보내기를 포함하여 다음과 같이 보이는 XML을 생성 할 수 있습니다 사용하는 데이터 유형에 상관없이 나는 이것이 당신이하고있는 것보다 빠르다고 믿지만, 스스로 테스트하는 것과 같은 것은 아무것도 없다.

+1

일괄 처리를 원한 또 다른 이유는 모든 개별 '커밋 (commit)'문이 크게 느려지 게된다는 것입니다. –