我有一个包含3个数据字段的简单插入语句。 Tag_ID不是主键而不是自动增量, 一个时间戳,它将一个简单的DateTime Now保存为字符串,浮点值包含一个简单的偏差计算。
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;
答案 0 :(得分:2)
答案 1 :(得分: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以匹配您正在使用的任何数据类型。 我相信这比你正在做的更快,但没有什么比自己测试更好了。