我想將使用guid主鍵/聚簇索引的錶轉換爲使用int標識。這是SQL Server 2005中有兩個表MainTable
和RelatedTable
,而目前的表結構如下:如何在轉換爲標識ID時更新guid ID引用
MainTable。[40萬行]
IDGuid - uniqueidentifier - PK
-- [data columns]
RelatedTable [400萬行]
RelatedTableID - uniqueidentifier - PK
MainTableIDGuid - uniqueidentifier [foreign key to MainTable]
SequenceNumber - int - incrementing number per main table entry since there can be multiple entries related to a given row in the main table. These go from 1,2,3... etc for each MainTableIDGuid value.
-- [data columns]
爲MainTable
聚簇索引是當前的主鍵(IDGuid
)。 RelatedTable
的聚簇索引當前爲(MainTableIDGuid, SequenceNumber)
。
我想我的轉換是做幾件事情:<
- 變化
MainTable
使用一個整數ID代替GUID - 添加
MainTableIDInt
列相關的錶鏈接到主表的整數ID - 將主鍵和聚簇索引
RelatedTable
更改爲(MainTableIDInt, SequenceNumber)
- 擺脫guid列。
我寫了一個腳本來做到以下幾點:
- 添加
IDInt int IDENTITY
列MainTable
。這會執行表重建並生成新的身份標識值。 - 將
MainTableIDInt int
列添加到RelatedTable
。
下一步是與其相應MainTable.IDInt
值[基於的GUID ID的匹配]來填充每一行的列RelatedTable.MainTableIDInt
。這是我掛上的一步。我知道這不會很快,但我希望能儘可能地發揮它的作用。
我可以寫一個SQL語句,這是否更新:
UPDATE RelatedTable
SET RelatedTable.MainTableIDInt = (SELECT MainTable.IDInt FROM MainTable WHERE MainTable.IDGuid = RelatedTable.MainTableIDGuid)
或
UPDATE RelatedTable
SET RelatedTable.MainTableIDInt = MainTable.IDInt
FROM RelatedTable
LEFT OUTER JOIN MainTable ON RelatedTable.MainTableIDGuid = MainTable.IDGuid
的「顯示估計的執行計劃」顯示大致相同的這兩個查詢。它吐出的執行計劃執行以下操作:
- 簇索引掃描過
MainTable
和RelatedTable
和確實一個合併加入他們[估計行數的= 400百萬] - 排序[估計行數的= 400百萬]在
RelatedTable
[估計的行數= 400億]
我關心的這個性能
如果您發佈的是代碼或XML,請**在文本編輯器中突出顯示這些行,然後單擊編輯器工具欄上的「代碼」按鈕(101 010)以精確地格式化和語法突出顯示它!此外,如果您使用1.,2等枚舉 - 在每一行結尾處確實不需要
。如果要突出顯示固定字體和灰色背景中的標識符(如表格名稱),請標記標識符並按Ctrl-K進行格式化。 – 2010-06-24 05:24:59
這次更新*會*嚴重地對您的系統徵稅,但我沒有看到任何「魔法子彈」如何使這個消失。你需要更新所有4億行 - 真的沒有辦法。唯一的問題是你是否可以在你的第二次更新聲明中使用INNER JOIN - 但是這可能不會產生太大的影響, – 2010-06-24 05:26:46