повышение производительности MS SQL вставки с Lazarus - PullRequest
0 голосов
/ 21 января 2011

У меня есть простой оператор вставки с 3 полями данных.Tag_ID, который не является первичным ключом и не является автоматическим приращением, отметка времени, которая сохраняет простой DateTime Now в виде строки и значение с плавающей запятой, которое содержит простое вычисление деления.

сервер 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 ]

2 голосов
/ 21 января 2011

Полагаю, больше всего времени занимают поездки в БД.Вместо этого вы можете создать 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, чтобы соответствовать любым типам данных, которые вы используете.Я верю, что это будет быстрее, чем то, что вы делаете, но нет ничего лучше, чем тестировать это самостоятельно.

2 голосов
/ 21 января 2011
...