我正在寻找关于如何实现大规模插入过程的一些建议,比如每秒400条记录的调整。数据来自外部实时触发器,当数据发生更改时,应用程序将收到通知。当数据发生变化时,我需要消耗它。
我已经研究了几种不同的批处理实现,包括使用datatables / sqlbulkcopy或写入csv和消费。
你能推荐什么?
答案 0 :(得分:2)
如果你想逐个插入它们,我建议只构建一个准系统存储过程,它将它的参数简单地插入到没有索引,约束,任何东西的临时表中。这将允许您非常快速将数据导入数据库,并且您可以通过每一分钟或其他事件单独处理并批量处理行。
或者,您可以让应用程序存储记录,直到达到某个数字,然后使用表值参数将proc插入到数据库中。然后,您只需要插入一个您选择批量处理的行数。这个成本应该是微不足道的。但请注意,如果您的应用程序在插入足够的行之前崩溃,那么这些行将丢失。
SqlBulkCopy是一个功能强大的工具,但顾名思义,它是为批量加载表而构建的。如果您有持续的插入请求流,我不建议使用它来加载您的数据。如果您想要批量处理大量请求以便一次性加载所有这些,这可能是一种很好的方法,但不是一种经常性和频繁的活动。
答案 1 :(得分:1)
这对我来说效果很好。我不能保证你每秒400:
private async Task BulkInsert(string tableName, DataTable dt)
{
if (dt == null)
return;
using (SqlBulkCopy bulkCopy = new SqlBulkCopy("./sqlserver..."))
{
bulkCopy.DestinationTableName = tableName;
await bulkCopy.WriteToServerAsync(dt);
}
}