2012-04-28 164 views
0

我打算在nhibernate orm層中使用c#和mssql數據庫,並且試圖確定在生產中使用哪種方法會更快。唯一標識符策略

據我所知,Guids需要4倍多的空間而不是16個對4個字節。

數據的同步將會頻繁發生。這是一個棘手的問題,因爲壞的方法會導致大量的內存消耗。使用整數可以引起更快的響應,但每次數據插入必須通過數據庫才能從序列中獲取值。

因此,我應該在內部mssql上使用帶有標識的整數方法,還是在標識列的nhibernate映射中使用HiLo生成器?

我會不會遇到使用GUID的性能問題?

+2

性能是非常小的。我寧願使用可維護策略,而不是使用32位或128位標識符進行微型優化。既然你想同步數據,一個guid而不是遞增的int會更好,因爲如果你使用一個int,你基本上需要確保在插入之前增量的int在另一個數據庫中不被「取用」。 – Patrick 2012-04-28 17:55:26

+0

好的,應該使用guid。謝謝。如何接受你的答案? – Grunf 2012-04-28 18:06:19

+0

我可以讓它成爲答案..給我一分鐘.. – Patrick 2012-04-28 18:37:39

回答

2

比較32位數據類型(4字節int)而不是比較128位數據類型(guid)的性能可能非常小。我沒有任何數字,最大的原因是128位數據類型會佔用多個寄存器,而不是較小的數據類型。由於我們正朝着64位體系結構邁進,因此比較時,guid將採用兩個寄存器而不是一個。

不過,我寧願使用基於問題要求的可維護策略,而不是試圖優化32位或128位標識符。

由於您聲明其中一個要求是同步數據庫,因此首選guid而不是遞增int。如果使用遞增的int,則基本上需要確保在插入之前,遞增的int不會在另一個數據庫中「被佔用」。

當然,你可以有一些這樣的策略,比如每個客戶端只生成一個特定的範圍子集,但這已經通過使用一個GUID來覆蓋。由於它的大小以及它的創建方式,每個客戶都可以創建一個guid,而其他人可能會重複該guid。

因此,要改一下,我會建議使用,而不是比較一個GUID比較一個int之間的Guid