删除主键(聚簇索引)以提高插入性能

Kir*_*rst 5 primary-key clustered-index sql-server-2008 database-performance

我们一直在经历SQL超时,并确定该瓶颈是审计表 - 我们系统中的所有表都包含插入,更新和删除触发器,这会导致新的审计记录.

这意味着审计表是系统中最大且最繁忙的表.然而,数据只会进入,并且永远不会出现(在此系统下),因此不需要select执行任何性能.

select top 10最近运行一个返回记录而不是"第一个"记录. order by当然可以工作,但是我希望选择顶部应该根据它们在光盘上的顺序返回行 - 我希望它会返回最低的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
Run Code Online (Sandbox Code Playgroud)

mar*_*c_s 8

根据Kimberly Tripp(索引女王)的说法 - 在表上拥有聚簇索引实际上有助于INSERT性能:

集群指数辩论继续

  • 与堆相比,嵌入在集群表中更快(但仅在"右"聚簇表中).这里的主要问题是IAM/PFS中用于确定堆中插入位置的查找比群集表(其中插入位置已知,由群集键定义)慢.插入到定义了顺序(CL)的表中以及该顺序不断增加的位置时,插入更快.

资料来源:博客文章称为集群指数辩论继续......