我们一直在经历 SQL 超时,并已确定该瓶颈是审核表 - 我们系统中的所有表都包含插入、更新和删除触发器,这些触发器会导致新的审核记录。
这意味着审计表是系统中最大且最繁忙的表。然而数据只进入,永远不会出来(在这个系统下)所以没有select
需要性能。
运行一个select top 10
返回最近插入的记录而不是“第一”记录。order by
当然可以,但我希望选择顶部应该根据光盘上的顺序返回行 - 我希望这会返回最低的 PK 值。
有人建议我们放弃聚集索引,实际上也放弃主键(唯一约束)。正如我之前提到的,没有必要select
从这个系统内的这个表。
聚集索引会对表造成什么样的性能影响?拥有无索引、非集群、无键表会产生哪些(非选择)后果?还有其他建议吗?
edit
我们的审计涉及 CLR 函数,我现在正在使用和不使用 PK、索引、FK 等进行基准测试,以确定 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