對於SQL服務器,使用uniqueidentifier(GUID)還是bigint作爲標識列更好?使用uniqueidentifier(GUID)或bigint作爲標識列更好嗎?
回答
這取決於你在做什麼:
- 如果速度是主要的關注,然後一個普通的老
int
足夠大的可能。 - 如果你真的會有超過20億(與B;))記錄,然後使用
bigint
或順序guid。 - 如果您需要能夠輕鬆地與遠程創建的記錄同步,那麼
Guid
真的很棒。
更新
一些額外的(不太明顯)便籤的GUID:
- 它們可苦了索引,並削減對數據庫性能的核心
- 您可以使用順序guid來獲得一些索引性能,但放棄了第二點中使用的一些隨機性。
- Guid可能很難手動調試(
where id='xxx-xxx-xxxxx'
),但您也可以通過連續指令獲取一些指令(where id='xxx-xxx' + '123'
)。 - 出於同樣的原因,Guids可以使基於ID的安全攻擊變得更加困難 - 但並非不可能。 (您不能只輸入
'http://example.com?userid=xxxx'
,並期望得到別人帳戶的結果)。
這不是20億行嗎? INT已簽名。 – 2009-02-02 21:17:13
;)好吧...我會脫掉我的-1 – 2009-02-02 21:25:40
即使id是一個int,我還會使用一個額外的guid列來提供一個用於URL的查找......要麼是一個或另外的相關參數防止這種攻擊。 – 2009-02-02 21:31:27
一般來說,我建議在GUID
之上使用BIGINT
(因爲指令很大且很慢),但問題是,你甚至需要這個嗎? (也就是說你在做複製嗎?) 如果你預計少於20億行,那麼傳統的INT
就可以。
這真的取決於進入的信息是否以某種方式連續。我強烈建議像用戶這樣的GUID可能會更好。但對於順序數據,如訂單或其他需要易於排序的數據,bigint可能是更好的解決方案,因爲它將被索引並提供快速排序而無需其他索引的成本。
並不取決於你的需要。 DB 性能將從整數獲得,而GUID對於複製有用,並且不需要從DB回聽已經創建了什麼標識,即代碼可以在插入行之前創建GUID標識。
這實際上取決於您是否期望在圖片中進行復制。複製需要一個UUID行,所以如果你打算這樣做,你最好先做。
如果您打算使用合併複製,那麼ROWGUIDCOL
對性能有益(see here for info)。否則,我們需要更多關於「更好」定義的信息;什麼更好?
你在做複製嗎?或者你有銷售人員運行斷開的數據庫需要合併,使用GUID。否則,我會去一個int或bigint。從長遠來看,它們更容易處理。
傑夫阿特伍德已經回答了一切in this comprehensive post。
除非你真的需要一個GUID,比如能夠在任何地方生成密鑰,而不僅僅是在服務器上,那麼我會堅持使用基於INTEGER的密鑰。創建GUID非常昂貴,並且難以真正查看數據。另外,你有沒有試過在SQL查詢中鍵入一個GUID?這是痛苦的!
我與安德魯羅林斯。
現在你可以爭論空間效率。 int是什麼,最多8個字節?指導將持續更長時間。
但我有兩個主要的偏好理由:可讀性和訪問時間。數字比GUID更容易(因爲我總是可以輕鬆地找到下一個/上一個記錄)。
至於訪問時間,請注意一些數據庫可能會出現GUID的BIG問題。我知道這是MySQL的情況(MySQL InnoDB Primary Key Choice: GUID/UUID vs Integer Insert Performance)。這對於SQL Server來說可能不是什麼大問題,但需要注意的是。
我會說堅持INT或BIGINT。唯一一次我想你會希望得到GUID的是當你要放棄它,並且不希望人們出於安全原因能夠猜測其他記錄的ID時。
可以有更多方面或要求使用GUID。
- 如果主鍵是任何數字類型(Int,BigInt或任何其他),那麼您需要將其設置爲Identity列,或者您需要檢查表中上次保存的值。
- 在這種情況下,如果外表中的記錄被保存爲事務,那麼很難獲得主鍵的最後一個標識值。就像使用IDENT_CURRENT一樣,那麼在保存外鍵記錄時將會再次實現性能。
- 因此,在保存與事務相關的記錄的情況下,首先爲主鍵生成Guid,然後將生成的鍵(Guid)保存在主表和外表中。
- 1. 使用bigint作爲非羣集鍵和guid/UNIQUEIDENTIFIER作爲主鍵非羣集
- 2. SQL Server 2008從BIGINT轉換爲UNIQUEIDENTIFIER/GUID並返回
- 3. Uniqueidentifier作爲SQL Server CE中的標識?
- 4. 更新標識列從INT到BigInt
- 5. 從bigint中將列的數據類型更改爲uniqueidentifier
- 6. 爲什麼新的ASP.NET標識錶停止使用Guid(uniqueidentifier類型)作爲關鍵字?
- 7. C#guid和SQL uniqueidentifier
- 8. 使用列表或集合更好嗎?
- 9. 爲什麼asp.net使用GUID列而不是bigint
- 10. SSRS使用給定的Guid作爲標識符創建報告
- 11. SQL Azure SPLIT ON UNIQUEIDENTIFIER GUID
- 12. 使用INT或GUID作爲主鍵
- 13. 整數或GUID的表標識符
- 14. 對所有型號標識使用guid
- 15. 如何在轉換爲標識ID時更新guid ID引用
- 16. 不能通過GUID作爲uniqueidentifier存儲過程
- 17. 連續的GUID到bigint
- 18. 使用class.isEnum()或instanceof Enum更好嗎?
- 19. 使用fwrite()或move_uploaded_file()會更好嗎?
- 20. 使用HttpContext.Current.IsDebuggingEnabled或#if DEBUG更好嗎?
- 21. 使用ob_get_contents()或$ text是更好嗎?='test';
- 22. 使用eventListener或readyStateChange會更好嗎?
- 23. 標識列作爲主鍵
- 24. c#識別sql uniqueidentifier
- 25. 在公共數據集成Web服務中使用GUID作爲標識
- 26. 更好使用標籤或分支?
- 27. 如果列不是主鍵,您可以使用GUID作爲列嗎?
- 28. 使用內置函數名稱作爲屬性或方法標識符是不好的做法嗎?
- 29. 使用mapred或mapreduce包創建Hadoop作業會更好嗎?
- 30. 如何從SqlDataReader獲得Guid uniqueidentifier
您是不是指主鍵?您不能擁有GUID標識列。 – 2009-02-02 21:10:39