在SQL Server相关表中将主键从GUID更改为BigInt的方法

时间:2010-04-28 14:24:20

标签: sql-server performance indexing guid bigint

我有两个表,其中10-20万行具有GUID主键,并且有12个表通过外键相关。基表每个都有10-20个索引。

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

  1. 删除所有相关表格上的所有索引和fkeys。
  2. 为每个表添加“NewPrimaryKey”列
  3. 在两个基表上创建密钥标识
  4. 脚本数据更改“更新表x,设置NewPrimaryKey = y其中OldPrimaryKey = z
  5. 将原始主键重命名为“oldprimarykey”
  6. 重命名'NewPrimaryKey'列'PrimaryKey'
  7. 回写所有索引和fkeys
  8. 这看起来像是一种好方法吗? 有没有人知道有助于此的工具或脚本?

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

3 个答案:

答案 0 :(得分:3)

你的方法是我如何做到的。

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

int, bigint, smallint, and tinyint

答案 1 :(得分:0)

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

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

...
4.Script数据更改“更新表x,设置NewPrimaryKey = y,其中OldPrimaryKey = z
5. 将原始主键删除为'oldprimarykey' 6.重命名'NewPrimaryKey'栏目'PrimaryKey' 7.Script返回所有索引和fkeys(构建聚簇索引“rebuilds”表)
8.对于所有没有聚簇索引的表,做一些事情以确保它们被重建并回收它们的空间(这样的构建然后删除聚簇索引)

毋庸置疑,在开始生产之前在开发盒上测试它!

答案 2 :(得分:0)

我还要补充一下:

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