我在sql Server Management Studio中遇到了newsequentialid()学习问题。创建带有uniqueidentifier列“ UniqueID”的表,并将默认值设置为newsequentialid()。

步骤1.保存设计:

“ Table_1”表
-验证“ UniqueID”列的默认设置时出错。

仍然保存它。

步骤2.查看sql:

CREATE TABLE [dbo].[Table_1](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](50) NOT NULL,
    [UniqueID] [uniqueidentifier] NOT NULL
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[Table_1] ADD  CONSTRAINT [DF_Table_1_UniqueID]  DEFAULT (newsequentialid()) FOR [UniqueID]
GO


看起来很合理。

步骤3.添加一些行:

1    test    72b48f77-0e26-de11-acd4-001bfc39ff92
2    test2    92f0fc8f-0e26-de11-acd4-001bfc39ff92
3    test3    122aa19b-0e26-de11-acd4-001bfc39ff92


它们看起来不太顺序。 ??

编辑:如果插入全部一次完成,则我的工作会有所工作,那么唯一的ID是顺序的。在以后的插入中,SQL Server似乎忘记了最后一个顺序ID,并开始了一个新的顺序。

在ssms中运行此命令会导致顺序引导:

insert into Table_1 (Name) values('test13a');
insert into Table_1 (Name) values('test14a');
insert into Table_1 (Name) values('test15a');
insert into Table_1 (Name) values('test16a');
insert into Table_1 (Name) values('test17a');

最佳答案

当您的表由uniqueidentifier集群时,newsequentialid主要用于解决页面碎片的问题。您的表由整数列聚类。我设置了两个测试表,一个测试表的newsequentialid列是主键,另一个不在(如您的),并且GUID始终是顺序的。另一方面,他们不是。

我不知道它如此行事的内部原因/技术原因,但是很显然,只有当您的表被它簇集时,newsequentialid()才是真正顺序的。否则,它的行为似乎类似于newid()/ RowGuid。

另外,我很好奇为什么您在不需要时会使用newsequentialid()。 newid()没有很多缺点,也没有任何好处-最大的好处是newid()实际上是不可预测的,而newsequentialid()是可以预测的。如果您不担心碎片,那有什么意义呢?

09-20 08:37