【问题标题】:Import Data from one database to another database of slightly changed schema将数据从一个数据库导入到另一个架构略有变化的数据库
【发布时间】:2012-03-12 05:42:22
【问题描述】:

我有一个数据库,其中包含多个表和大量记录,比方说

数据库1
 -tbl1
 -tbl2
 -tbl3
 - tbln

这些表具有 PK-FK 关系。 PK 的数据类型为“uniqueIdentifier”类型。最近我读到,使用 uniqueIdentifier 作为数据类型会影响性能,并且对于 PK 使用整数类型总是更好,因为它可以导致更快的索引。

因此我们决定更改表以将 PK 数据类型作为整数标识。其余所有结构将保持不变。该数据库中还有一些数据应该是完整的。

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

这是我们的做法-

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

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

  • 有更好的方法吗?
  • 我们能否对原始数据库本身进行更改/更新,而不必创建第二个数据库然后将数据迁移到其中?

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

【问题讨论】:

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


    【解决方案1】:

    GUID 可以影响性能,但不一定。我一直都在使用它们,而且我也会根据情况使用基于整数的主键。

    除非您能指出具体的性能问题,否则我的建议是不要管它。

    使用uniqueidentifier 的最大问题是如何生成新的 ID 值,尤其是当主键在聚集索引中时。如果您使用NEWID(),它是相当随机的,因此它可能会插入表空间内的任何位置,从而导致不必要的页面拆分。使用NEWSEQUENTIALID() 更好,因为它会创建顺序的唯一标识符,但每次数据库启动时它都有一个新的随机种子,因此它也不总是附加到表的末尾。

    恕我直言,最好的解决方案是使用 COMB 样式的 GUID,该 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 列
    • 填充它们
    • 根据需要索引它们
    • 删除旧列的表约束
    • 为新列添加新约束
    • 删除旧列
    • 将新列重命名为旧名称(如果需要)

    【讨论】:

    • 您好,richardtallent,感谢您的回答。这些表存储了大量的记录,并且一些查询具有复杂的连接。我们想从中提取最大性能,即使整数和唯一标识符之间的性能只有细微差别,我们也需要它。还要感谢您的策略 - 乍一看它看起来很有希望,我会评估并回复你 - 非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多