Sql server 使用lazarus提高ms sql插入性能
我有一个简单的insert语句和3个数据字段。 不是主键且不是自动递增的标记ID, 将easy DateTime Now保存为字符串和包含简单Device计算的浮点值的时间戳 sql server实际上是本地的,但稍后它将位于不在本地网络中的另一台计算机上。现在我有25.8秒的时间输入10000个条目。。我该如何改进这一点 我的代码如下所示:Sql server 使用lazarus提高ms sql插入性能,sql-server,performance,lazarus,Sql Server,Performance,Lazarus,我有一个简单的insert语句和3个数据字段。 不是主键且不是自动递增的标记ID, 将easy DateTime Now保存为字符串和包含简单Device计算的浮点值的时间戳 sql server实际上是本地的,但稍后它将位于不在本地网络中的另一台计算机上。现在我有25.8秒的时间输入10000个条目。。我该如何改进这一点 我的代码如下所示: procedure TForm1.testMssql(Datensaetze: integer); var i: integer; before,
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;
批量插入
批量插入
我想往返db所花的时间最多。 相反,您可以创建一个如下所示的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>
您必须修改SP以匹配所使用的任何数据类型。
我相信这将比您正在做的更快,但是没有什么比您自己测试更快的了。我想往返数据库花费的时间最多。 相反,您可以创建一个如下所示的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>
您必须修改SP以匹配所使用的任何数据类型。
我相信这会比你现在做的更快,但是没有什么比自己测试更好的了。想要批处理的另一个原因是,所有的
commit
语句都会显著降低速度。想要批处理的另一个原因是,所有的commit
语句都会显著降低速度。