将数据从一个数据库导入到稍微更改的模式的另一个数据库

时间:2012-03-12 05:42:23

标签: sql-server primary-key uniqueidentifier data-migration identity-column

我有一种情况,我有一个包含多个表和大量记录的数据库,让我们说

Database 1
 - tbl1
 - tbl2
 - tbl3
 - tbln

这些表具有PK-FK关系。 PK的数据类型是'uniqueIdentifier'类型。最近我读到将uniqueIdentifier作为数据类型会妨碍性能,并且为PK提供整数类型总是更好,因为它可以使索引更快。

因此我们决定更改表以使PK数据类型为整数Identity。休息所有的结构将保持不变。此数据库中也包含一些应该完整的数据。

有人可以帮助我解决这个问题的最佳方法 - 更新后,数据和PK-FK关系应保持不变。

这是我们的做法 -

  • 使用PK数据类型作为整数标识
  • 创建新表[DB2]
  • 添加所有PK-FK关系
  • 编写程序以将数据从DB1迁移到DB2

我们知道这不是一项小任务,因为它涉及很多具有PK-FK关系的表

  • 有更好的方法吗?
  • 我们是否可以在原始数据库本身进行更改/更新,而无需创建第二个数据库,然后将数据迁移到其中?

任何帮助表示赞赏。感谢。

1 个答案:

答案 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

如果您发现必须更换马匹,请按照以下方式进行:

  • 以不同的名称
  • 向每个表添加新的ID列
  • 填充它们
  • 根据需要对其进行索引
  • 删除旧列上的表约束
  • 为新列添加新约束
  • 删除旧列
  • 将新列重命名为旧名称(如果需要)