来自C#的多个更新和插入

时间:2013-01-10 16:56:34

标签: c# sql-server

我是一个字符串,用分号分隔INSERTUPDATES分配给SqlCommmand.CommandText,然后调用ExecuteNonQuery()

它“有效”,但我担心当字符串中有40,000个INSERTS时会发生什么。所有这些都发生在一个SQL事务中吗?我应该以某种方式批量生产它们,批次应该有多大?

4 个答案:

答案 0 :(得分:1)

对于40.000个插入,您可能希望它们在单个事务中发生:它对性能有好处,甚至更好地用于错误恢复(如果出现问题,您将无法获得部分填充表)。据我所知,它并不是自动发生的(即如果你没有启动事务就没有事务,并且如果数据库级别没有隐式开放事务(这需要显式提交)无论如何))。

我建议使用带参数的准备查询,在循环中运行它,所有这些都在显式打开的事务中。

答案 1 :(得分:1)

如果您有强大的插入值架构,请考虑使用user-defined table type。 您可以将DataTable作为参数传递给命令(自定义命令或存储过程)。

它比CSV更直截了当。

我同意@Anton Kovalenko - 如果您插入大量行,您应该立即执行此操作。仅当您想要插入超大(例如milions)数量或行时,将其拆分为多个批处理但不要单独插入每一行。

答案 2 :(得分:0)

对于40.000插入,您希望它们处于多个线程中处理的SEPARATE事务中。或者您希望它们使用SqlBUlkCopy发生到临时表,而不是通过字符串插入。

基本上,创建一个临时表,将sqlbulkcopy放入临时表中,用插入复制到select中。

这比所有SQL文本解析快得多。批次 - 好吧,我经常批量插入近100,000行。性能大约是每秒75k行。

答案 3 :(得分:-1)

这取决于您尝试在一个命令中发送的总字节数。 我知道的唯一限制是批量大小为65,536 *网络数据包大小(通常为4096)= 268 435 456字节 http://msdn.microsoft.com/en-us/library/ms143432.aspx

相关问题