1

有一个使用实体框架的项目(v1 和 .NET 3.5)。它已经使用了几年,但现在被更多的人使用。开始出现超时错误,并已将其归结为几件事。为简单起见,假设我的数据库有三个表:product、part 和 product_part。大约有 1400 个零件和少量产品。

用户可以将任意数量的部件添加到产品中。我的问题是,当产品中添加了许多零件时,插入件需要很长时间。我认为这主要是由于网络流量/延迟,但插入所有 1400 需要大约一分钟。如果有人在插入这些记录时进入并尝试查看零件的详细信息,我会超时,并且可以在 SQL Server 的活动监视器中看到一个块。

我能做些什么来避免这种情况?如果以前有人问过这个问题,我很抱歉,我错过了。

谢谢,
尼克

4

1 回答 1

1

我认为根本问题是您的写入事务需要很长时间。EF 不擅长执行海量 DML。它在单独的网络往返和单独的语句中执行每个插入。

如果要插入 1400 行,并且性能很重要,请使用 TVP ( INSERT ... SELECT * FROM @tvp) 在单个语句中进行插入。或者切换到批量复制,但我认为只有 1400 行不会有优势。

如果您的读取事务被阻塞,这是一个问题,请打开快照隔离。这会 100% 照顾读者,因为他们从不会在快照隔离下阻塞。

于 2012-12-07T18:03:44.393 回答