3

我有一个包含许多列的表,其中总的最大大小大大超过了 8k 边界。这个表包含一个 ModuleID 列,它基本上告诉你它是什么类型的对象(不要担心——我没有设计这个),其中可能有 15 个不同的值。然后它有一个名为 propertyID 的唯一列,它也是一个 IDENTITY(1,1),然后由 SQL Server 递增。ModuleID 上有一个聚集索引,这个值对于选择总是已知的,更新时使用 propertyID(moduleID 很少在此范围内)。表包含几百万行。

因此,关于 INSERT,我的问题是:
a) 非唯一聚集键是否会增加 SQL Server 持有独占页级锁而不是键(行)锁的可能性?
b) 将聚集键更改为递增的唯一 propertyID 将使 SQL Server 能够持有独占 KEY 锁,而这些总是会进入聚集索引的最后一页?

表(在某些安装中)在 moduleID 上分区的事实会改变你的答案吗?

4

1 回答 1

1

我没有任何确凿的事实或数字来支持这一点,但根据我的经验和知识,我会说:

惊讶??

让我解释一下:SQL Server 中的聚簇索引必须是唯一的。是的,它必须。不,您不必使其唯一 - 如果您不这样做,SQL Server 本身将通过在集群索引中冲突的行中添加一个 4 字节的“唯一符”(一个 INT)来处理这一点。

所以最后,你总是有一个唯一的集群键——你必须这样做,因为这实际上是指向实际数据的“物理”指针——否则非聚集索引如何能够快速有效地找到该数据,如果不是为了某种独特的“指针”?

因此,即使您有点粗心并为您的集群键选择了一个不能保证唯一的列(或一组列),SQL Server 最终也会确保它们是唯一的 - 可能会以额外的成本为代价这些唯一符所需的存储空间。

所以你真的总是留下一个唯一的集群键,因此,页面级锁定的可能性应该没有任何差异。

于 2010-09-27T21:40:56.820 回答