插入GUID PK需要更长时间并导致分页吗?

时间:2014-11-06 17:58:31

标签: sql-server primary-key guid

为主键选择GUID与身份INT ...

GUID的插入是否会花费更长的时间,因为它必须在索引中搜索顺序位置以放置该GUID?并且它可以导致分页?

如果这是真的,也许我们应该一直使用身份INT?

感谢。

2 个答案:

答案 0 :(得分:1)

确实,较新的GUID值可能小于先前插入的GUID。是的,足够的这些可以强制索引扩展页面。 INT或BIGINT自动增量/标识列不会遇到这种情况,除非您使用标识插入ON手动插入较低的标识。

如果由于某种原因无法从GUID更改签出 NEWSEQUENTIALID() http://msdn.microsoft.com/en-us/library/ms189786.aspx 它会找到比以前使用的更大的GUID。需要注意的是,“大于”部分仅在机器重启时才成立。

布拉德

答案 1 :(得分:0)

我认为你的意思是CLUSTERED INDEX比PRIMARY KEY更多。当然,使用NEWID()时,任何索引都会相当快速地碎片化,因为值不会不断增加,从而导致页面拆分。

我在这里提供了非顺序INSERT操作效果的相当详细的解释:
What is fragmenting my index on a table with stable traffic?

是的,NEWSEQUENTIALID()要好得多,至少在GUID方面,因为它是顺序的,但是,它不能防止页面拆分。问题是起始值是根据重新启动服务器时重置的值确定的。因此,在重新启动之后,新的顺序范围可以开始低于先前的第一个记录。此时的第一个INSERT将导致页面拆分,但从那里应该没问题。

此外,UNIQUEIDENTIFIER为16字节,而INT为4,甚至BIGINT为8.增加的大小使每行占用更多空间,因此每行8k数据页上的行数更少。分配新页面需要时间,特别是如果您需要增长数据文件以适应新页面(行数越大,数据文件填充越快)。因此,是的,您很可能应该从一开始就使用INT IDENTITY

在需要外部和/或可移植标识符的情况下(这是GUID非常方便的地方),那么您仍然应该将INT(或甚至BIGINT)IDENTITY字段作为集群PK开始,并使另一列成为GUID上放置了一个UNIQUE INDEX。这被称为替代密钥,在这些情况下效果很好。