我们的一个系统有一个每天接收大约 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 成本
我真的很想弄清楚这一点,但我现在很难过。有什么建议吗?