0

我们的一个系统有一个每天接收大约 20k 插入的表——它目前包含大约 1000 万行。我们刚刚推出了系统升级,现在我在插入此表时遇到了一些令人震惊的缓慢性能(30-40 秒的跟踪)。Inserts 一次只能插入一行。实体框架正在生成以下 SQL:

declare @generated_keys table([ID] uniqueidentifier)

insert [dbo].[Table]([Col1], Col2], etc)

output inserted.[ID] into @generated_keys values (@0, @1, etc)

select t.[ID] from @generated_keys as g join [dbo].[Table] as t on g.[ID] = t.[ID] where @@ROWCOUNT > 0

没有什么不寻常的——至少在我看来。

该表有 12 个 FK。由于实体表示基于时间的事件,因此聚集索引位于DateCreated列上。还有 8 个非聚集索引,包含各种列。该ID列是 PK 并且具有唯一的非聚集索引。

作为说明,我注意到,由于遗漏,该ID列使用newid()而不是newsequentialid().

实际的执行计划包括以下主要部分:

7x 3% - FK 表上的聚集索引查找

1x 8% - 表格插入 (@generated_keys)

1x 74% - 聚集索引插入,1 个实际行,0.09 成本

我真的很想弄清楚这一点,但我现在很难过。有什么建议吗?

4

1 回答 1

-2

正如您所注意到的,SaveChange 为每个记录插入进行数据库往返。因此,如果您每天添加 20k 条记录,则执行 20k 数据库往返。

修改和改进索引几乎没有区别,因为真正的问题是数据库往返次数!

要修复性能,您必须使用允许执行批量插入的库

支持它的三个专业库:

您可以在此处了解有关这三个库的更多信息: 实体框架批量插入库评论和比较

免责声明:我是实体框架扩展项目的所有者

于 2016-05-24T13:42:04.640 回答