感謝精彩文章The Cost of GUIDs as Primary Keys,我們有COMB GUID。基於當前實現,有2種方法:8個字節的時間戳或6個字節的時間戳記COMB GUID在SQLServer
- 利用最後6個字節的時間戳:GUIDs as fast primary keys under multiple databases
- 使用最後8個使用字節時間戳窗口勾選:GUID COMB strategy in EF4.1 (CodeFirst)
我們都知道, GUID爲6字節的時間戳,隨機字節的字節數將減少,以減少GUID的衝突。但是會創建更多具有相同時間戳的GUID,並且這些GUID根本不是順序的。因此,8字節的時間戳將是首選。
所以這似乎是一個艱難的選擇。基於商品上方GUIDs as fast primary keys under multiple databases,它說:
在我們繼續之前,短註腳對這種做法:使用1毫秒的分辨率時間戳指的GUID產生非常接近可能具有相同的時間戳值,等等將不會順序。這可能是一些應用程序常見的情況,實際上我嘗試了一些其他方法,例如使用System.Diagnostics.Stopwatch等更高分辨率的計時器,或將時間戳與「計數器」相結合,以保證序列一直持續到時間戳更新。但是,在測試過程中,我發現這並沒有產生明顯的差異,即使在同一毫秒的時間內生成了幾十甚至幾百個GUID。這與Jimmy Nilsson在測試COMBs期間遇到的一致
只是想知道是否有人知道數據庫內部可以分享一些關於上述觀察的燈。這是因爲數據庫服務器只是將數據存儲在內存中,並且只有在達到特定閾值時才寫入磁盤?因此,具有相同時間戳的具有非序列GUID的插入數據的重新排序通常會發生在存儲器中,因此性能損失最小。
更新: 根據我們的測試,梳GUID不能因爲它聲稱在互聯網上隨機GUID相比減少表的碎片。看來現在唯一的方法是使用SQL Server來生成順序的GUID。
我認爲列出的所有文章都將*主鍵*與*聚簇索引鍵*混淆。 GUIDS可以很好地用作主鍵,尤其是在多主環境下,但不能很好地用作聚簇索引鍵(雖然「效果不好」取決於表中的其他列)。 –
是的,你說得對。我們主要關心的是由於在我們的表中聚簇PK的GUID的隨機性,它會產生很多碎片。有關我的問題的任何想法在同一時間戳內的隨機GUID的性能? – windfly2006
如果沒有其他列用作聚簇索引鍵,那麼我會去'newsequentialid()'(從下面的@ErikE)。 –