我正在寻找为什么会这样或者我可以加快速度的方法。
我基本上用这样的代码构造了一个对象
(伪代码)
Person p = new Person();
Address a = new Address() { ... properties set here ... };
Employer e = new Employer() { ... properties set here ... };
// etc.
p.Employer = e;
p.Address = a;
//etc.
最后:
_context.Person.Add(p);
当我分析代码时,人的构造需要 0 毫秒,它快如闪电。但是,当我将人添加到上下文中时,大约需要 1500 毫秒。可能与约束检查有关吗?数据库非常大,尽管它没有加载到内存或其他任何东西中,所以它不Add
应该触及数据库。
只有当我写的时候_context.SaveChanges()
才应该写。
有什么提高速度的建议吗?
编辑:基准是这样完成的:(sw is a new Stopwatch()
)
sw.Restart();
context.Person.Add(p);
Console.WriteLine("Person added to context: " + sw.ElapsedMilliseconds + "ms");
编辑2:情节变厚了。
当我加载大量人员并将他们添加到数据库中时,我所做的第一个操作是查看该人是否已经存在于数据库中。出于速度原因,我将 Person.PersonId 的完整列表拉到哈希表中,并检查它们是否有要插入的每条记录。
如果此人已存在于列表中,我将其从数据库中拉出。这需要大约 5 毫秒,而且我不对数据做任何事情(因为我还没有写那部分),只是跳到下一个。
但是,当它到达正在添加到上下文中的新条目时,正是该行导致了大幅减速。这是代码:
matchPerson = _context.Person.SingleOrDefault(c => c.PersonId == intPersonId);
因此,如果他们已经通过 0ms 哈希表检查(它是即时的)在数据库中,它会将人从数据库中拉出。
大约需要 5 毫秒才能完成。
如果我_context.Add
在这条线出现时执行上述操作,它会变得非常慢。如果我将其注释掉,大约需要 40 毫秒,并且每增加一条记录就会增加(因此在 2,000 条记录之后大约需要 200 毫秒)。
我看不到这两行之间的链接,所以上下文查询可能会重置上下文的状态并减慢下一个操作的速度?