【问题标题】:Approach for altering Primary Key from GUID to BigInt in SQL Server related tables在 SQL Server 相关表中将主键从 GUID 更改为 BigInt 的方法
【发布时间】:2011-02-13 09:22:43
【问题描述】:

我有两个具有 10-2000 万行的表,它们具有 GUID 主键,并且至少有 12 个通过外键相关的表。每个基表有 10-20 个索引。

我们正在从 GUID 迁移到 BigInt 主键。我想知道是否有人对方法有任何建议。现在这是我正在考虑的方法:

  1. 删除所有相关表上的所有索引和 fkey。
  2. 为每个表添加“NewPrimaryKey”列
  3. 在两个基表上创建密钥标识
  4. 脚本数据更改“更新表x,设置NewPrimaryKey = y where OldPrimaryKey = z
  5. 将原始主键重命名为“oldprimarykey”
  6. 将“NewPrimaryKey”列重命名为“PrimaryKey”
  7. 脚本返回所有索引和 fkeys

这看起来是个好方法吗? 有谁知道可以对此有所帮助的工具或脚本?

TD:根据附加信息进行了编辑。请参阅此博客文章,其中介绍了 GUID 为主时的一种方法:http://www.sqlmag.com/blogs/sql-server-questions-answered/sql-server-questions-answered/tabid/1977/entryid/12749/Default.aspx

【问题讨论】:

  • 你最终选择了哪条路线?除了您所说的之外,应用程序必须确保知道 PrimaryKey 现在是您的新数据类型,而不是 Guid。

标签: sql-server performance indexing guid bigint


【解决方案1】:

你的方法就是我会怎么做。

你真的需要 bigint 吗?常规的 4 字节 int 将达到 20 亿(2,147,483,647)。

int, bigint, smallint, and tinyint

【讨论】:

  • 我们可以在 10 年左右的时间内达到这个目标......这仅仅是一个空间问题还是 int 会在索引上提供更好的性能?
  • guid(唯一标识符)为 16 个字节,bigint 为 8 个字节,常规 int 为 4 个字节。这不仅仅是磁盘上的空间,还有内存中的缓存。此外,您将在页面上获得更多键(查找速度更快),并且每个索引都包含 PK,因此越小越好。
【解决方案2】:

听起来这个策略确实可行——删除约束,从它们下面更改列(类型更改,名称保持不变),然后重新创建约束相当优雅。

目标是最终删除 GUID 列吗?如果是这样,除非复制或重建表,否则您实际上不会回收空间,因此可能进行以下调整:

...
4.脚本数据更改“更新表x,设置NewPrimaryKey = y where OldPrimaryKey = z
5.删除原来的primarykey到'oldprimarykey'
6.将“NewPrimaryKey”列重命名为“PrimaryKey”
7. 编写所有索引和 fkey 的脚本(构建聚集索引“重建”表)
8.对于所有没有聚集索引的表,做一些事情来确保它们被重建并且它们的空间被回收(比如构建然后删除聚集索引)

不用说,在生产环境运行之前先在开发设备上进行测试!

【讨论】:

  • 为了向后兼容一些带有链接的旧电子邮件,我们需要将旧 ID 保留在两个基表中,以便如果有旧链接进入,我们可以找到它,否则,我们可以删除相关表旧专栏
【解决方案3】:

我还要补充:

在开始之前,请确保您有一个良好的当前备份。 将服务器更改为以单用户模式运行(首先通知用户中断时间)。 您不希望用户在此过程中尝试输入数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    • 2011-10-13
    相关资源
    最近更新 更多