我有一个包含许多列的表,其中总的最大值大大超过了8k的边界。这个表包含一个ModuleID列,它基本上告诉你它是什么类型的对象(别担心 - 我没有设计这个),其中可能有15个不同的值。然后它有一个名为propertyID的唯一列,它也是一个IDENTITY(1,1),然后由SQL Server递增。 ModuleID上有一个聚簇索引,这个值对于选择总是已知的,对于更新,使用了propertyID(在这里,moduleID很少在范围内)。表包含数百万行。
关于INSERT我的问题因此是:
a)非唯一的集群密钥是否增加了SQL Server持有独占页面级锁而不是KEY(行)锁的可能性?
b)将聚簇密钥更改为增加的唯一propertyID将使SQL Server能够保留独占的KEY锁,这些将始终进入聚簇索引的最后一页?
表格是(在某些安装中)在moduleID上分区的事实会改变你的答案吗?
答案 0 :(得分:1)
我没有任何硬性事实或数字来支持这一点,但根据我的经验和知识,我会说:没有。
惊讶??
让我解释一下:SQL Server中的聚簇索引必须是唯一的。是的,它必须。不,您不必使其独一无二 - 如果您不这样做,SQL Server本身将通过向您在聚类索引中发生冲突的行添加一个4字节的“唯一符号”(INT)来处理这个问题。 / p>
所以最后,总是拥有一个独特的聚类键 - 你必须这样做,因为这实际上是指向实际数据的“物理”指针 - 非聚集索引的其他方式是能够快速有效地找到数据,如果不能找到各种独特的“指针”吗?
因此,即使您有点粗心并且为您的群集密钥选择了一列(或一组列)并且不保证是唯一的,SQL Server也会确保它们最终可能在这些独特者需要额外存储的费用。
所以你真的总是留下一个独特的聚类键,因此,页面级锁定的可能性应该没有任何区别。