我们以两种方式使用mini profiler:
几周之后,我们发现写入分析DB需要很长时间(秒),并且在网站上引起实际问题.截断所有分析器表可以解决问题.
通过查看SqlServerStorage代码,看起来插入也会进行检查以确保具有该id的行不存在.这是为了确保数据库不可知代码吗?这似乎会随着行数的增加而引入大量惩罚.
如何从性能分析器中删除性能损失?还有其他人经历过这种减速吗?或者是我们做错了什么?
欢呼任何帮助或建议.
嗯,当我忘记默认聚集时,看起来我在如何创建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中的代码.
我强烈建议删除所有现有表并重新运行更新的脚本.
| 归档时间: |
|
| 查看次数: |
500 次 |
| 最近记录: |