【发布时间】:2014-07-22 08:47:20
【问题描述】:
我有一个应用程序,它从多个套接字接收数据,然后将数据写入数据库。
我目前正在使用 EF 来执行此操作。我想知道如何提高效率。
我读到批量插入更快,所以我只每 500 个插入者保存对数据库的更改:
db.Logs_In.Add(tableItem);
if (logBufferCounter++ > 500)
{
db.SaveChanges();
logBufferCounter = 0;
}
现在我已经分析了应用程序,并且 74% 的工作由函数完成:System.Data.Enitity.DbSet'1[System._Canon].Add
有没有更好的插入方法?也许将 tableItems 排队到一个列表中,然后将整个列表添加到数据库上下文中。
或者也许我看错了,我应该完全避免使用 EntityFramework 来进行这种更高性能的插入?目前它是我的应用程序的瓶颈,如果我查看系统资源,SQL 似乎连眼皮都没有动。
所以我的问题:
1:如何在多次插入中实现最有效/最快的插入
2:如果 EF 可以接受,我该如何改进我的解决方案?
我使用的是 SQL Server 2012 企业版, 传入的数据是一个恒定的流,但是我可以缓冲它,然后如果这是一个更好的解决方案,我可以进行批量插入。
[编辑]
进一步解释场景。我有一个线程在 concurrentQueue 上循环,该线程从该队列中取出项目。然而,由于分贝插入是瓶颈。队列中通常有数千个条目,所以如果还有一种异步或并行方式,我可能会使用多个线程来进行插入。
【问题讨论】:
-
这里stackoverflow.com/a/5942176/1663001关于高频插入的讨论非常好。
-
@DavidG,谢谢,如果我走 EF 路线,那真的很有帮助,我做出了更改建议,我的性能已经提高了 100 倍。
-
太棒了,我希望它对你来说已经足够了。如果不是,那么 Marc 的答案就是要走的路。
标签: c# sql entity-framework insert bulkinsert