我有一种情况,我有一个包含多个表和大量记录的数据库,让我们说
Database 1 - tbl1 - tbl2 - tbl3 - tbln
这些表具有PK-FK关系。 PK的数据类型是'uniqueIdentifier'类型。最近我读到将uniqueIdentifier作为数据类型会妨碍性能,并且为PK提供整数类型总是更好,因为它可以使索引更快。
因此我们决定更改表以使PK数据类型为整数Identity。休息所有的结构将保持不变。此数据库中也包含一些应该完整的数据。
有人可以帮助我解决这个问题的最佳方法 - 更新后,数据和PK-FK关系应保持不变。
这是我们的做法 -
我们知道这不是一项小任务,因为它涉及很多具有PK-FK关系的表
任何帮助表示赞赏。感谢。
答案 0 :(得分:0)
GUID 可以妨碍性能,但不一定如此。我一直使用它们,我也使用基于整数的主键,具体取决于具体情况。
除非您能指出具体的性能问题,否则我的建议是留下足够的好处。
使用uniqueidentifier
的最大问题是如何生成新的ID值,尤其是在主键位于聚簇索引中时。如果您使用NEWID()
,它是相当随机的,因此它可能会插入表空间中的任何位置,从而导致不必要的页面拆分。使用NEWSEQUENTIALID()
会更好,因为它会创建顺序uniqueidentifier,但每次数据库启动时它都会有一个新的随机种子,所以它并不总是附加到表的末尾。
最好的解决方案IMHO是使用COMB样式的GUID,其部分基于时间戳(当然是单调增加)和随机部分。 (作为一个微小的附带好处,如果你需要知道INSERT何时发生,你可以解码时间戳部分,假设信息也没有存储在其他地方。)
这是一个COMB函数示例:
CREATE FUNCTION [dbo].NewCOMB(@GUID uniqueidentifier)
RETURNS uniqueidentifier AS BEGIN
RETURN CAST(
CAST(NEWID() AS binary(10))
+ CAST(GETDATE() AS binary(6))
AS uniqueidentifier)
END;
这是一篇关于这个主题的精彩文章,有点过时但仍然很好:
http://www.informit.com/articles/article.aspx?p=25862&seqNum=7
如果您发现必须更换马匹,请按照以下方式进行: