【问题标题】:When to use NEWID or NEWSEQUENTIALID and why何时使用 NEWID 或 NEWSEQUENTIALID 以及为什么
【发布时间】:2017-03-08 11:13:50
【问题描述】:

我正在尝试了解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

【问题讨论】:

  • 首先是INSERT INTO MYTABLE ( NAME ) VALUES ('Ashraf Abusada');,然后是INSERT INTO MYTABLE ( NAME ) VALUES ('Ashraf Abusada');——我们不是只是创建了一个副本吗?是的,停止使用IDENTITY 并且出于同样的原因不要使用NEWID()NEWSEQUENTIALID()
  • 您是否建议改用代码生成序列?
  • 我建议一个只有在 IDENTITY 列上的键的表没有真正的数据完整性,您应该重新考虑整个方法,而不是调查其他序列号。
  • @onedaywhen ,你用什么例子来证明你的观点是错误的?名称可以重复。制作 varchar 列 PK 效率不高。假设即使像 email 这样的任何 varchar 列在任何表然后我们不做电子邮件PK。我们将身份列作为PK并通过代码检查重复的约束。

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


【解决方案1】:

如果我理解正确的话,GUID 的性能并不总是很好,因为它不是索引的可排序字段。
通过创建可更好地排序的 GUID,sequentialid 可以克服这个问题,从而为您的表创建更好的索引。

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

因此,如果您想使用 GUID 作为主键,我建议您使用 sequenceID。

您应该问自己为什么要将 GUID 作为主键,如果不需要,而不是不需要。

【讨论】:

  • Guids 是可排序的。但由于它们的随机性,新记录可能会卡在索引中的任何位置,从而导致索引碎片
【解决方案2】:

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

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

我不会使用SEQUENTIALID;如果您想订购,请改用“梳子”GUID。

The Cost of GUIDs as Primary Keys

【讨论】:

  • 您能否详细说明newsequentialid() 和COMB GUID 之间的区别?或者提供解释差异的链接?
  • 引用的文章已经过时了,尽管其中一些仍然适用,但缺少重要信息。从表面上看,所谓的 COMB guid 与 newsequentialid() 所做的非常相似,因此作者吹捧的性能提升并不真正适用。他的比较只考虑了 newid() 而不是较新的 newsequentialid()。
  • 这并没有回答要求 newid() 和 newsequentialid() 之间差异的问题 - 实际上它根本没有考虑差异。
  • @eis:有时你必须回答真正的问题......
【解决方案3】:

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

【讨论】:

  • 并没有真正回答 OP 的完整问题。
  • 也不对。 SQL Server 中的 NEWID() 使用类型 4 GUID,它们只不过是具有巨大值域的大型随机数(2^122 {6 位保留用于 GUID 类型和版本标识),但不能保证它们是唯一的。即使只有 2 台机器也可能发生碰撞)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-13
  • 2021-01-24
  • 2013-01-05
  • 2017-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多