0

我有一个带有 3 个数据字段的简单插入语句。Tag_ID 不是主键,也不是自动递增,时间戳将简单的 DateTime Now 保存为字符串,浮点值包含简单的 devid 计算。

sql server 实际上是本地的,但稍后它将位于不在本地网络中的另一台机器上。现在我得到 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;  
4

2 回答 2

2

批量插入

http://msdn.microsoft.com/de-de/library/ms188365.aspx

于 2011-01-21T09:08:42.110 回答
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 以匹配您使用的任何数据类型。我相信这会比你正在做的更快,但没有什么比自己测试更好的了。

于 2011-01-21T09:08:50.810 回答