所以我有一个存储在JsonArray中的id列表。目前,我正在循环使用id:
'Insert ids into table
For Each userId As Int32 In idList
command.CommandText = "INSERT INTO user_ids (id) VALUES (" & userId & ");"
command.ExecuteNonQuery()
Next
当它运行时,它会执行大约100个查询给予或接受,具体取决于id列表的大小。我想要做的是使用批量查询,这样我可以在一个查询中完成所有查询,而不是对数据库进行100次查询。我一直在寻找使用DataSets和BulkCopy,但我不确定如何实现它。
有更好的解决方案吗?
任何帮助将不胜感激。感谢。
答案 0 :(得分:1)
设置执行BULK INSERT或SqlBulkCopy可能会更有效率,但只有大约100行,您是否会看到明显的改善,甚至是任何改进都是值得怀疑的。将数据按摩到BULK INSERT友好格式所花费的时间很容易超过这里的数据库吞吐量增益。您还需要权衡增加的代码复杂性和引入新技术是否可以证明您所看到的任何改进。
相反,我只是想在循环中保留相同的查询和连接对象,如下所示:
Using cn As New SqlConnection("connection string here"), _
cmd As New SqlCommand("INSERT INTO user_ids (id) VALUES ( @UserID )" )
cmd.Parameters.Add("@UserID", SqlDbType.Integer)
cn.Open()
'Insert ids into table
For Each userId As Int32 In idList
cmd.Parameters("@UserID").Value = userId
cmd.ExecuteNonQuery()
Next
End Using
除了保护代码免受sql注入攻击之外的好处之外,这段代码应该比你拥有的更快,因为数据库将能够在循环期间缓存该执行计划,从而跳过编译并在执行单个查询时生成计划步骤。
如果此插入定期发生(例如每天一次),您可能还会看一下有关使用最小日志记录的知识库文章:
http://technet.microsoft.com/en-us/library/ms191244(v=sql.105).aspx