我们以两种方式使用迷你探查器:
几周后,我们发现写入性能分析数据库需要很长时间(秒),并且会导致网站出现真正的问题。截断所有分析器表可以解决问题。
查看SqlServerStorage代码,看来插入还会检查以确保具有该id的行不存在。这是为了确保数据库不可知代码吗?这似乎会随着行数的增加而引入巨大的惩罚。
如何从性能分析器中删除性能损失?还有其他人经历过这种减速吗?或者这是我们做错了什么?
欢呼任何帮助或建议。
答案 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。
我高度建议删除所有现有表并重新运行更新后的脚本。