MiniProfiler SqlServerStorage变得非常慢

时间:2012-12-03 20:59:36

标签: mvc-mini-profiler

我们以两种方式使用迷你探查器:

  1. 在具有弹出窗口的开发者计算机上
  2. 在我们的staging / prod环境中,SqlServerStorage存储到MS SQL
  3. 几周后,我们发现写入性能分析数据库需要很长时间(秒),并且会导致网站出现真正的问题。截断所有分析器表可以解决问题。

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

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

    欢呼任何帮助或建议。

1 个答案:

答案 0 :(得分:5)

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

因为数据以与聚簇索引相同的顺序物理存储在磁盘上(实际上,可以说表聚簇索引),SQL Server必须保留每个新插入的行物理秩序。当我们使用的是一个随机数时,这就成了一个噩梦。

修复是添加一个自动增加的int并将主键切换到那个,就像all the other tables一样(为什么我忽略了这一点,我不记得了......我们不使用这个存储提供程序这里有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);

另一个编辑

好的,我已经更新了创建脚本并为大多数查询添加了索引 - see the code here in GitHub

高度建议删除所有现有表并重新运行更新后的脚本。