0

我有一個情況我有幾個表和大量的在他們記錄的數據庫的另一個數據庫,讓我們說進口數據從一個數據庫中略有改變模式

Database 1 
- tbl1 
- tbl2 
- tbl3 
- tbln 

的表有PK-FK關係。 PK的數據類型是'uniqueIdentifier'類型。最近我讀到具有uniqueIdentifier作爲數據類型可能會妨礙性能,並且最好爲PK提供整數類型,因爲它可以使索引更快。

因此,我們決定改變表有PK的數據類型爲整數的身份。休息所有的結構將保持不變。此外,這個數據庫中有一些數據應該是完整的。

有人可以幫我解決這個問題的最佳方法 - 更新後,數據和PK-FK關係應該保持不變。

這是我們做這件事的方法 -

  • 創建新表[DB2]與PK的數據類型爲整數身份
  • 添加所有的PK-FK關係
  • 編寫一個程序來遷移從DB1數據到DB2

我們知道,因爲它涉及到很多的表與PK-FK關係,這是一個不小的任務

  • 是否有這樣做的更好的辦法?
  • 我們可以使原始數據庫本身的改變/更新用,而無需創建一個第二個數據庫,然後將數據遷移到了嗎?

任何幫助表示讚賞。謝謝。

回答

0

A GUID 可以阻礙性能,但不一定。我一直都在使用它們,而且我也使用基於整數的主鍵,具體取決於具體情況。

除非你可以指向一個特定的性能問題,我的建議是獨自離開不夠好。

使用uniqueidentifier時遇到的最大問題是如何生成新的ID值,特別是當主鍵位於聚簇索引中時。如果你使用NEWID(),它是相當隨機的,所以它可能會插入表空間中的任何地方,導致不必要的頁面拆分。使用NEWSEQUENTIALID()更好,因爲它會創建順序唯一標識符,但每次數據庫啓動時都會有一個新的隨機種子,因此它並不總是追加到表的末尾。

最好的解決方案恕我直言,是使用COMB風格的GUID,它有一部分基於時間戳(當然這是單調遞增的)和一部分是隨機的。 (作爲一個微小的副作用,如果您需要知道INSERT何時發生,您可以解碼時間戳部分,假設信息沒有存儲在別處。)

下面是一個例子COMB功能:

CREATE FUNCTION [dbo].NewCOMB(@GUID uniqueidentifier) 
RETURNS uniqueidentifier AS BEGIN 
    RETURN CAST(
     CAST(NEWID() AS binary(10)) 
     + CAST(GETDATE() AS binary(6)) 
    AS uniqueidentifier) 
END; 

下面是關於這個問題的一個偉大的文章,有點過時,但還是不錯的:

http://www.informit.com/articles/article.aspx?p=25862&seqNum=7

如果你發現你必須換馬,這樣做:

  • 添加新的ID列到每個表下不同的n AME
  • 填充它們
  • 指數並根據需要
  • 對老列刪除表約束
  • 添加新的約束對新列
  • 移除舊列
  • 重命名新列到舊名稱(如果需要)
+0

嗨richardtallent,感謝您的答案。這些表存儲了大量的記錄,並且一些查詢具有複雜的聯接。我們想要從中提取最高性能,即使整數和uniqueidentifier之間的性能只有細微的差異,我們也需要它。還要感謝這樣做的策略 - 首先看它看起來很有前途,我會評估並回復你 - 感謝一大堆! – Abey 2012-03-12 06:10:57

相關問題