“巨大”數據庫表 PK 的順序 GUID 或 bigint
我知道這類問題經常出現,但我還沒有讀到任何令人信服的論據來幫助我做出這個決定。請多多包涵!
我有一個龐大的數據庫——它每天增長大約 10,000,000 條記錄。數據是相關的,出於性能原因,我使用 BULK COPY 載入表。出於這個原因,我需要為行生成鍵,並且不能依賴 IDENTITY 列。
一個 64 位整數 - bigint - 足夠我使用,但為了保證唯一性,我需要一個集中的生成器來為我生成我的 ID。我目前有這樣一個生成器服務,它允許服務保留 X 序列號並保證沒有衝突。但是,這樣做的結果是我擁有的所有服務都依賴於這個集中式生成器,因此我在如何分發我的系統方面受到限制,並且對其他依賴項(例如需要網路訪問)不滿意通過這種設計。這有時是個問題。
我現在正在考慮使用順序 GUID 作為我的主鍵(在 SQL 外部生成)。據我自己的測試確定,唯一的缺點是更廣泛的數據類型的磁碟空間成本(在索引中使用它們會加劇這種情況)。與 bigint 替代方案相比,我沒有目睹查詢性能有任何明顯的下降。使用 BULK COPY 載入表會稍微慢一些,但不會慢很多。由於我的順序 GUID 實現,我的基於 GUID 的索引沒有變得碎片化。
基本上,我想知道的是是否還有其他我可能忽略的考慮因素。目前,我傾向於採取飛躍並開始使用 GUID。我絕不是數據庫專家,所以我非常感謝任何指導。
我也有類似的情況。目前,我正在使用順序 GUID 方法,並且沒有碎片和簡單的密鑰生成。
我注意到導致我開始遷移到 bigint 的兩個缺點:
- 空間使用。每個索引多 8 個字節。將其乘以 10 個索引左右,您會浪費大量空間。
- 列儲存索引不支持 GUID。
(2) 是我的殺手。
我現在將像這樣生成我的密鑰:
yyMMddHH1234567890
我將使用領先的日期加小時,然後有一個連續的部分。這使我可以按日期範圍查詢我的數據,而無需任何附加索引。這對我來說是一個不錯的獎勵。
我將使用HiLo算法生成 bigint 的順序部分,該算法非常適合分佈式。
希望其中一些轉移到您的情況。我絕對推薦使用 bigint。