【发布时间】:2011-11-08 01:16:30
【问题描述】:
我们一直在遇到 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
【问题讨论】:
标签: sql-server-2008 primary-key clustered-index database-performance