簡體   English   中英

使用INT或GUID作為主鍵

[英]Using INT or GUID as primary key

我試圖在SQL服務器VB.net中創建一個ID列,它將為數據庫中創建的每個新行提供一系列數字。 所以我使用以下技術來創建ID列。

select * from T_Users
ALTER TABLE T_Users     
ADD User_ID INT NOT NULL IDENTITY(1,1) Primary Key

然后我在數據庫中注冊了幾個用戶名,它運行得很好。 例如,前六行是1,2,3,4,5,6。 然后我在NEXT日注冊了4個用戶,但這次ID號從6跳到了非常大的數字,例如:1,2,3,4,5,6,1002,1003,1004,1005。 然后兩天后,我又注冊了兩個用戶,新行讀取3002,3004。 所以我的問題是為什么我每隔一天就注冊用戶就跳過如此大的數字。 我用來創建序列的技術是錯誤的嗎? 如果有問題,請有人告訴我該怎么做對嗎? 現在,由於我對上面使用的技術感到沮喪,或者我嘗試使用順序生成的GUID值。 生成GUID值序列。 然而,唯一的缺點是,它產生一個非常長的數字(INT大小的4倍)。 我的問題是使用GUID有沒有比INT更重要的優勢?

問候,

GUID的好處:

如果您希望脫機客戶端能夠創建新記錄,則GUID很好,因為當新記錄同步回主數據庫時,您永遠不會遇到主鍵沖突。

GUID的缺點:

GUID作為主鍵可能會影響數據庫的性能,因為對於群集主鍵,數​​據庫將希望按鍵值的順序保留行。 但這意味着現有記錄之間存在大量插入,因為GUID將是隨機的。

使用IDENTITY列不會受此影響,因為保證下一條記錄具有最高值,因此每次都會在最后添加該行。 不需要重新洗牌。

有一個折衷方案是生成一個偽GUID,這意味着你會期望每70年左右發生一次密鑰沖突,但卻有助於索引編制。

另一個缺點是:a)它們確實占用了更多的存儲空間,而b)編寫SQL是一種真正的痛苦,也就是更容易輸入UPDATE TABLE SET FIELD = 'value' where KEY = 50003UPDATE TABLE SET FIELD = 'value' where KEY = '{F820094C-A2A2-49cb-BDA7-549543BB4B2C}'

您對IDENTITY列的聲明對我來說很好。 鍵值中的間隙可能是由於嘗試添加行失敗。 IDENTITY值將遞增但行永遠不會被提交。 不要讓它打擾你,它幾乎發生在每張桌子上。

編輯:

這個問題涵蓋了偽GUID我的意思。 在聚簇索引上使用順序GUID鍵的INSERT不會明顯加快

在SQL Server 2005+中,您可以使用NEWSEQUENTIALID()來獲取應該大於先前值的隨機值。 有關詳細信息,請參閱此處http://technet.microsoft.com/en-us/library/ms189786%28v=sql.90%29.aspx

我用來創建序列的技術是錯誤的嗎?

沒有。如果您的谷歌技能不存在。 對“Sql server identity skip values”的簡短介紹將為您提供TON的回報,包括:

SQL Server 2012列標識增量在第7個條目上從6跳到1000+

和規范:

為什么我的IDENTITY列值存在差距?

你基本上錯誤地認為sql server不會優化它對性能的訪問。 身份號碼是標記,沒有別的,沒有假設沒有差距請。

特別是:SQL Server預分配1000個塊中的數字 - 如果重新啟動服務器(如在工作站上),其余部分將丟失。

http://www.sqlserver-training.com/sequence-breaks-gap-in-numbers-after-restart-sql-server-gap-between-numbers-after-restarting-server/-

如果您使用手動sqyuence(new nin sql server 2012),您可以為此定義緩存大小(預生成)並將其設置為1 - 當您執行大量插入時,性能略低。

我的問題是使用GUID有沒有比INT更重要的優勢?

是。 你可以擁有GUID比使用int更多的行。 例如,int32限制為大約20億行。 對於我們中的一些人來說太低(我有100億范圍內的表),甚至64大的int是有限的。 一個真正的zetabyte數據庫,你必須按順序使用guid,自己生成。

任何正常的人都沒有看到差異,因為我們都沒有真正處理那么多行。 較大的尺寸使得很多東西變慢(較大的鍵大小=索引中較大的空間=較大的索引=相同操作的更多內存/ io)。 甚至你的順序ID也會跳躍。

為什么不把你的期望調整到現實 - 身份並不意味着沒有差距 - 或者使用帶緩存1的序列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM