MiniProfiler SqlServerStorage变得非常慢

Chr*_*ris 4 mvc-mini-profiler

我们以两种方式使用mini profiler:

  1. 在具有弹出窗口的开发人员计算机上
  2. 在我们的staging/prod环境中,SqlServerStorage存储到MS SQL

几周之后,我们发现写入分析DB需要很长时间(秒),并且在网站上引起实际问题.截断所有分析器表可以解决问题.

通过查看SqlServerStorage代码,看起来插入也会进行检查以确保具有该id的行不存在.这是为了确保数据库不可知代码吗?这似乎会随着行数的增加而引入大量惩罚.

如何从性能分析器中删除性能损失?还有其他人经历过这种减速吗?或者是我们做错了什么?

欢呼任何帮助或建议.

Jar*_*xon 5

嗯,当我忘记默认聚集时,看起来我在如何创建MiniProfilers时犯了一个大错误primary key...而聚集索引是一个GUID列,一个非常大的禁忌.

因为数据以与聚簇索引相同的顺序物理存储在磁盘上(实际上,可以说表聚簇索引),SQL Server必须将每个新插入的行保持在该物理顺序中.当我们使用基本上随机的数字时,这成为一个保持排序的噩梦.

修复是添加一个自动增加的int并将主键切换到那个,就像所有其他表一样(为什么我忽略了这一点,我不记得了...我们不在这里使用这个存储提供程序在Stack Overflow或者很久以前就会发现这个问题).

我将更新表创建脚本,并为您提供一些迁移当前表的功能.

编辑

再看一遍之后,主MiniProfilers表可能只是一个堆,意味着没有聚簇索引.对该行的所有访问都是通过该guid ID列进行的,因此没有物理排序会有所帮助.

如果您不想重新创建MiniProfiler sql表,则可以使用此脚本使主键非聚簇:

-- first remove the clustered index from the primary key
declare @clusteredIndex varchar(50);

select  @clusteredIndex = name
from    sys.indexes
where   type_desc = 'CLUSTERED'
        and object_name(object_id) = 'MiniProfilers';

exec ('alter table MiniProfilers drop constraint ' + @clusteredIndex);

-- and then make it non-clustered
alter table MiniProfilers add constraint 
  PK_MiniProfilers primary key nonclustered (Id);
Run Code Online (Sandbox Code Playgroud)

另一个编辑

好吧,我已经更新了创建脚本并为大多数查询添加了索引 - 请参阅GitHub中的代码.

强烈建议删除所有现有表并重新运行更新的脚本.