GUID:varchar(36)与uniqueidentifier

8kb*_*8kb 16 sql-server performance database-design guid sql-server-2008

我正在使用遗留数据库将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)
Run Code Online (Sandbox Code Playgroud)

我认为将GUID存储为唯一标识符会更好,因为它只有16个字节而不是36个字节.

将GUID存储为varchar有什么好处吗?

Mit*_*eat 13

也许只有你可以从SELECT语句中"读取"它们的事实(尽管我认为这不是特别有用,因为你可以在select中使用函数来使Uniqueidentifiers可显示).

如果表很大,则每行节省20个字节是相当可观的.

  • 你会获得更多,这就是PK,所以如果有任何子桌,他们也会节省成本.如果表上有任何其他索引,并且这是聚簇索引,则所有索引的大小(可能是速度,但测试确定)将更小.由于许多原因,coursre和INT作为PK更好,但这是遗留数据库中的巨大变化. (7认同)
  • 为什么实体框架使用`nvarchar(128)`作为其GUID呢?我可以把它换成'uniqueidentifier`吗? (3认同)

MSI*_*MSI 5

由于许多原因,我会选择使用uniqueidentifier,

它将占用更少的空间;它是唯一的,因此不能重复。对于比较和与性能特别相关的问题,以及易于获得唯一的默认值等,这要好得多。

除非出于非常特殊的原因需要使用varchar,否则我将使用uniqueidentifier。