2010-04-28 31 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

我也想補充:

確保您在開始之前有一個良好的當前備份。 將服務器更改爲以單用戶模式運行(首先通知用戶中斷期間)。 您不希望用戶在此過程中嘗試輸入數據。

相關問題