我们的一个系统有一个表,每天接收大约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成本
我真的想深究这一点,但我现在很难过。有什么建议吗?
答案 0 :(得分:-2)
正如您所注意到的,SaveChange为每个记录插入进行数据库往返。因此,如果您每天添加20k记录,则会执行20k数据库往返。
修改&改进的索引几乎没有差别,因为真正的问题是数据库往返的数量!
要修复性能,您必须使用允许执行批量插入的库
有三个专业图书馆支持它:
您可以在此处了解有关这三个库的更多信息: Entity Framework Bulk Insert Library Reviews & Comparisons
免责声明:我是该项目的所有者Entity Framework Extensions