2010-09-27 29 views
3

我有一张桌子,其中有很多列,总的最大尺寸大大超过8k的边界。这个表包含一个ModuleID列,它基本上告诉你它是什么类型的对象(不用担心 - 我没有设计这个),其中可能有15个不同的值。然后它有一个称为propertyID的唯一列,它也是一个IDENTITY(1,1),然后由SQL Server增加。在ModuleID上有一个聚集索引,这个值对于选择总是已知的,因为使用了propertyID(moduleID很少在这里是范围)。表格包含数百万行。非唯一集群密钥是否会增加页级锁定的可能性?

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

表格是否(在某些安装中)在moduleID上进行分区会改变您的答案?

回答

1

我没有任何硬性的事实或数字来支持这一点,但从我的经验和知识,我会说:没有

惊讶?

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

因此,最后,你总是总有有一个唯一的聚类键 - 你必须,因为这实际上是指向实际数据的“物理”指针 - 非聚集索引如何能够找到数据的快速和有效,如果不是一个独特的“指针”的种类??

所以,即使你有点粗心,并且为你的集群密钥选择了一列(或一组列),SQL Server也会确保它们到最后 - 可能在这些独特性所需的额外存储费用。

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

+0

谢谢马克,我忘记了那个独特的人。但它是一个序列?如果上面的propertyID已经是聚簇键,则新的插入将转到索引的最后一页。这是唯一的例子吗?我试图找出如何减少插入的可能性,如果聚集键可以在这个角色扮演一个角色。或者,页面锁定可能性只是我想要在行中保存多少数据的函数? – Tinkerer 2010-09-28 07:41:19

相关问题