我有以下设置:
我在循环中添加行,如下所示(首先是 EF 代码):
using (var context = new MyDb())
{
loop() //25k rounds
{
var t3 = new Table2();
var t2 = new Table2();
var t1 = new Table1{prop1 = t2, prop2 = t3};
context.Table1.Add(t1);
context.SaveChanges();
}
}
Run Code Online (Sandbox Code Playgroud)
因此,循环总共需要 25k 圈,我的性能测量显示,它将在大约10 小时内添加这些行!现在我不知道这是因为这是使用 EF 进行此类操作的正常时间,还是因为我的 dbms 有问题?
我有一个应用程序,它从多个套接字接收数据,然后将数据写入数据库。
我目前正在使用 EF 来执行此操作。我想知道如何才能提高效率。
我读到,批量插入速度更快,所以我只每 500 个插入保存对数据库的更改:
db.Logs_In.Add(tableItem);
if (logBufferCounter++ > 500)
{
db.SaveChanges();
logBufferCounter = 0;
}
Run Code Online (Sandbox Code Playgroud)
现在我已经分析了应用程序,74% 的工作是由该函数完成的:System.Data.Enitity.DbSet'1[System._Canon].Add
有没有更好的方法来进行插入?也许将表项排队到列表中,然后将整个列表添加到数据库上下文中。
或者也许我看错了,我应该完全避免使用 EntityFramework 来实现更高性能的插入?目前它是我的应用程序中的瓶颈,如果我查看系统资源,SQL 似乎根本没有动过眼睛。
所以我的问题:
1:如何在多次插入中实现最高效/最快的插入
2:如果EF可以接受,我该如何改进我的解决方案?
我使用的是 SQL Server 2012 企业版,传入的数据是恒定的流,但是我可以缓冲它,然后执行批量插入(如果这是更好的解决方案)。
[编辑]
进一步解释该场景。我有一个线程在并发队列上循环,该线程使该队列中的项目出列。然而,由于数据库插入是瓶颈。队列中通常有数千个条目,因此,如果还有一种异步或并行方式,我可能会利用多个线程来执行插入。
我正在开发一个项目,它只使用Entity Framework代码首先插入相对大量的记录(250K记录,只有2列).
但是将所有记录写入数据库需要花费太多时间(2~3小时)!
是因为实体框架很慢,有大量或记录或什么?
PS
代码段:
foreach (var t in myCollection)
{
Db.Words.Add(t);
Db.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)