我要做几个插入到一个表中。现在,我列出了迭代的对象列表,对于每个对象,我使用insert语句执行ExecuteNonQuery。几个插入性能c#
我想知道是否有紧固的方式来做到这一点。 这样,插入800个寄存器需要几分钟的时间。
我在Java中使用了executeBatch方法,对于这个建议,谁在C#中有类似的东西。
问候!
我要做几个插入到一个表中。现在,我列出了迭代的对象列表,对于每个对象,我使用insert语句执行ExecuteNonQuery。几个插入性能c#
我想知道是否有紧固的方式来做到这一点。 这样,插入800个寄存器需要几分钟的时间。
我在Java中使用了executeBatch方法,对于这个建议,谁在C#中有类似的东西。
问候!
插入是[比较]快速/便宜行。 提交慢/昂贵。
除非它是一个高延迟连接,多个(如在,数百)插入语句应该很好。
“...需要几分钟......”听起来像交易没有被使用(因此可能有800次提交 - 哎唷!)。一个控制在C#中交易最简单的方法是使用TransactionScope:
using (var connection = ...)
using (var tx = new TransactionScope()) {
foreach (var row in rows) {
// insert row
}
// commit all at once
tx.Complete();
}
我只会考虑方法是否限制交易的数量(从而提交)不足以满足功能要求。
快乐编码。
你的语句可能是这样的:
insert into my_table (field1, field2, ...)
values (row1_value1, row2_value2, ...),
(row2_value1, row2_value2, ...), ...
因此,如果您创建例如一个StringBuilder,您可以批了20个,50个或100插入,并发出要少得多插入语句。
如果您想要从.NET应用程序执行所有操作,请查看Performing Batch Operations Using DataAdapters (ADO.NET)。
如果您想获得最快的性能,可以使用bcp utility(假设您使用的是SQL Server)。您会将数据写入分隔文件并使用bcp执行插入操作。
如何在由';'分隔的字符串中写入所有插入语句?并将此字符串传递给ExecuteNonQuery?
检查错误只是比较插入的次数与受影响的是的ExecuteNonQuery返回
您也可以创建一个存储过程,它接收XML参数 –
我已经使用事务作用域(在业务层),所以我认为只有一个提交时tx.Complete() – Keetah
@Rodrigo只是验证它真的被使用 - 在几分钟内800提交*真的很慢*。我无法想象,即使是过度索引和/或不好的碎片化也会导致这种情况(但我更为惊讶;-)。还要验证服务器的延迟是否可以接受; [高]延迟将成为限制单个命令速度的问题。 (延迟50ms将最大单独命令/秒减少到约20;因此可能是发送较少单个命令的非常好的候选者。如果相关,将这些信息包括在帖子中。) – 2011-10-14 01:11:32
我正在尝试通过VPN进程通过互联网,所以也许是问题。我如何检查延迟 – Keetah