我们遇到SQL超时并已发现瓶颈是审计表 - 我们系统中的所有表都包含导致新审计的插入,更新和删除触发器记录。删除主键(聚集索引)以提高插入性能
这意味着审计表是系统中最大和最繁忙的表。然而,数据只是进来,并且从来没有出现(在这个系统下),所以不需要select
性能。
运行select top 10
返回最近插入的记录而不是'第一个'记录。当然,order by
的作品,但我希望一个选择顶部应该根据他们在光盘上的顺序返回行 - 我期望会返回最低的PK值。
有人建议我们放弃聚集索引,实际上也是主键(唯一约束)。正如我前面提到的,在这个系统中不需要select
。
聚簇索引在表上创建什么类型的性能影响?有没有索引,非集群,无密钥表的(非选择)分支是什么?还有其他建议吗?
编辑
我们的审计涉及CLR函数,现在我有没有& PK,索引,FKS等基准来确定的CLR函数&的约束控制下的相对成本。
调查结束后,糟糕的表现与insert
声明无关,而是CLR功能,它编排了审计。在删除CLR并改为使用直接TSQL处理程序后,性能提高了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
我发现这一点在桌子尺寸增加时尤其如此。 –