我们一直在经历 SQL 超时,并确定瓶颈是审计表——我们系统中的所有表都包含插入、更新和删除触发器,这些触发器会导致新的审计记录。
这意味着审计表是系统中最大和最繁忙的表。然而,数据只进不出(在这个系统下),所以不需要select
性能。
运行select top 10
返回最近插入的记录而不是“第一条”记录。 order by
当然可以,但我希望 select top 应该根据它们在磁盘上的顺序返回行——我希望这会返回最低的 PK 值。
有人建议我们删除聚集索引,实际上也删除主键(唯一约束)。正如我之前提到的,select
在这个系统中不需要从这个表中获取。
聚集索引会对表产生什么样的性能影响?拥有一个无索引、非集群、无键表的(非选择)后果是什么?还有其他建议吗?
编辑
我们的审计涉及 CLR 功能,我现在正在使用和不使用 PK、索引、FK 等进行基准测试,以确定 CLR 功能和约束的相对成本。
经调查,性能不佳与insert
报表无关,而是与协调审计的 CLR 功能有关。移除 CLR 并使用直接的 TSQL proc 后,性能提高了 20 倍。
在测试期间,我还确定聚集索引和标识列对插入时间的影响很小或没有影响,至少相对于发生的任何其他处理而言。
// updating 10k rows in a table with trigger
// using CLR function
PK (identity, clustered)- ~78000ms
No PK, no index - ~81000ms
// using straight TSQL
PK (identity, clustered) - 2174ms
No PK, no index - 2102ms