2010-04-28 120 views
6

我有两个包含10到200万行的GUID主键和通过外键相关的12个表的表。基表每个都有10-20个索引。在SQL Server相关表中将主键从GUID更改为BigInt的方法

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

  1. 删除所有涉及表上的所有索引和fkey。
  2. 添加“NewPrimaryKey”列各表
  3. 使在两个基表
  4. 脚本数据改变“更新表x中的键的身份,设置NewPrimaryKey = y其中OldPrimaryKey = Z
  5. 重命名原始的PrimaryKey以 '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

+0

你最终走哪条路?除了你所说的之外,应用程序必须确保知道PrimaryKey现在是你的新数据类型而不是Guid。 – user420667 2017-04-12 20:51:41

回答

0

这当然听起来像这种策略会工作 - 下降的约束,从它们下面出更改列(类型的变化,名称保持不变),然后重新创建约束是相当优雅。

最终删除GUID列的目标是什么?如果是这样,你就不会真正回收空间,除非表复制或重建,所以也许以下调整:

...
4.Script数据改变“更新表X,设置NewPrimaryKey = y其中OldPrimaryKey = Z
5. 掉落原来的PrimaryKey为 'oldprimarykey'
6.Rename的 'NewPrimaryKey' 列 '的PrimaryKey'
7.Script背面的所有索引和fkeys(建筑物聚簇索引 “重建” 表)
8.对于没有聚集索引的所有表,请执行一些操作以确保它们得到重建,并且它们的空间是回收(如建立,然后删除一个聚集索引)

不用说,在生产中运行之前在开发箱上测试它!

+0

为了向后兼容某些带有链接的旧电子邮件,我们需要将旧ID保留在两个基本表中,因此如果旧链接进来,我们可以找到它,否则,在相关表中,我们可以删除旧列 – BoomTownTech 2010-04-28 15:07:55

3

您的方法是我会怎么做。

你真的需要bigint吗?一个普通的4字节int将会达到20亿(2,147,483,647)。

int, bigint, smallint, and tinyint

+0

我们可以在10年左右时间内实现这个目标......这仅仅是一个空间问题,还是一个int可以在索引上提供更好的性能? – BoomTownTech 2010-04-28 15:08:54

+3

guid(uniqueidentifier)的16个字节,或者bigint的8个字节,或者普通int的4个字节。这不仅仅是磁盘空间,还有内存缓存。另外,你会在页面上获得更多的键值(更快的查找),并且每个索引都包含PK,所以越小越好。 – 2010-04-28 15:42:09

0

我也想补充:

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

相关问题