2010-08-19 40 views
14

我正在與存儲GUID值作爲一個varchar(36)的數據類型的傳統數據庫工作:GUID:VARCHAR(36)與唯一標識符

CREATE TABLE T_Rows (
    RowID VARCHAR(36) NOT NULL PRIMARY KEY, 
    RowValue INT   NOT NULL 
) 

INSERT T_Rows (RowID, RowValue) VALUES (NEWID(), 1) 

我假設存儲GUID作爲唯一標識符將是可取的,因爲它只有16字節大小,而不是36.

將GUID作爲varchar存儲有什麼優勢嗎?

+0

我非常懷疑它! – 2010-08-19 23:26:38

回答

12

也許只有你可以從SELECT語句中讀取它們的事實(儘管我不認爲這樣做特別有用,因爲你可以在select中使用一個函數來使Uniqueidentifiers可顯示)。

如果表很大,每行保存20個字節是相當可觀的。

+6

YOu會獲得更多,這是PK,所以如果有任何子表,他們也會節省成本。如果表中有任何其他索引,並且它是聚簇索引,則所有索引的大小(以及可能的速度但可以確定的測試)將會更小。 Coursre和INT在許多原因上都是更好的PK,但這是遺留數據庫的巨大變化。 – HLGEM 2010-08-20 14:08:27

+2

爲什麼entity-framework會爲其GUID使用'nvarchar(128)'?我可以把它換成'uniqueidentifier'嗎? – Zapnologica 2017-09-12 19:34:38

0

絕對不是,因爲我確定您知道遺留數據庫經常遭受設計缺陷:P因爲GUID是16個字節,所以它可能在數據庫中佔用16個字節。您將獲得每個條目的20個字節

1

我相信UNIQUEIDENTIFIER是在SQL Server 2000中添加的,所以有可能這個應用程序最初是爲不支持它的SQL Server 7編寫的。但是,這只是一個猜測,當然...

4

我會唯一標識符的原因有很多,如走,

將需要更少的空間;它是獨一無二的,所以它不能被複制。這比較好,特別是性能相關的問題,以及容易獲得獨特的默認值等。

我會使用uniqueidentifier,除非我需要使用varchar爲非常具體的原因。

+1

如果我可以添加。使用聯合數據庫時也更好。我會按照陳述去做guid。 – code5 2015-04-16 21:01:44

2

如果您的數據庫是Oracle,那麼舊版本的Oracle(9)中原始數據的索引性能比索引varchar(36)字段差得多,差得多。幸運的是,這在Oracle 10和11中已經發生了變化。