大表(EF)上的插入性能非常慢

时间:2016-05-24 09:50:07

标签: sql sql-server entity-framework sql-server-2012 alwayson

我们的一个系统有一个表,每天接收大约20k个插入 - 它目前包含~10m行。我们刚刚推出了系统升级版本,我现在在此表的插入上获得了一些令人震惊的缓慢性能(30-40s的痕迹)。插入内容一次只能插入一行。实体框架正在生成以下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成本

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

1 个答案:

答案 0 :(得分:-2)

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

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

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

有三个专业图书馆支持它:

您可以在此处了解有关这三个库的更多信息: Entity Framework Bulk Insert Library Reviews & Comparisons

免责声明:我是该项目的所有者Entity Framework Extensions