何时使用NEWID或NEWSEQUENTIALID以及为什么

时间:2016-10-26 07:35:47

标签: sql sql-server database tsql database-design

我想了解NewId和'NewSequentialId的实际使用情况,我在创建新表时通常会使用Identity属性:

CREATE TABLE MYTABLE
(
    [ID]    INT             PRIMARY KEY IDENTITY,
    [NAME]  NVARCHAR(MAX)   NOT NULL
);
GO

以上代码不是最佳做法,如果是这样,我应该用它替换它:

CREATE TABLE MYTABLE
(
    [ID]    UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID(),
    [NAME]  VARCHAR(MAX)    NOT NULL
);
GO

或者用这个:

CREATE TABLE MYTABLE
(
    [ID]    UNIQUEIDENTIFIER ROWGUIDCOL PRIMARY KEY DEFAULT NEWSEQUENTIALID(),
    [NAME]  nVARCHAR(MAX)   NOT NULL
);
GO

问题:NewId或NEWSEQUENTIALID是Identity的替代品,如果不是何时使用每个身份?

我不是试图将NewIdNewSequentialId用作Primary Key,上面的代码仅用于演示目的,也许这段代码更像是这样:

CREATE TABLE MYTABLE
(
    [ID]        INT                 NOT NULL PRIMARY KEY,
    [ROWGUID]   UNIQUEIDENTIFIER    ROWGUIDCOL DEFAULT NEWSEQUENTIALID(),
    [NAME]      nVARCHAR(MAX)       NOT NULL
);
GO

3 个答案:

答案 0 :(得分:2)

GUID作为主键的主要用途是在分布式系统中,您希望在客户端之间使用唯一ID,而无需往返于服务器/数据库的开销。

它们可能带来自己的问题,例如,如果用作集群密钥(可以通过适当的定期索引重建来缓解),则会出现碎片。

我不会使用SEQUENTIALID;而是使用'梳子' GUID如果您想要订购。

The Cost of GUIDs as Primary Keys

答案 1 :(得分:1)

如果我理解正确,那么GUID并不总是表现良好,因为它不是索引的可排序字段。
sequentialid可以通过创建更好的可排序的GUID来克服这个问题,从而为您的表提供更好的索引。

我知道它比这更复杂,但我想尽可能简单地解释。

因此,如果您想使用GUID作为主键而不是我建议使用顺序ID。

你应该问问自己为什么你想要一个GUID作为主键,如果不需要,那就不要了。

答案 2 :(得分:-1)

GUID密钥在全球范围内是独一无二的。如果您希望钥匙在全球范围内独一无二,则应使用它们。例如,群集中的多个服务器,或在制图中使用地图。