sql-server - sql server 2008 newsequentialid() 问题

标签 sql-server

我在 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');

最佳答案

newsequentialid主要是为了解决当你的表通过uniqueidentifier进行集群时出现页面碎片的问题。您的表由整数列聚集。我设置了两个测试表,一张的 newsequentialid 列是主键,一张不是主键(就像您的),并且在主键中 GUID 始终是连续的。另一方面,他们不是。

我不知道其行为的内部/技术原因为什么,但似乎很明显,newsequentialid() 仅当您的表由它聚集时才真正是顺序的。否则,它的行为似乎与 newid()/RowGuid 类似。

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

关于sql-server - sql server 2008 newsequentialid() 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/738801/

相关文章:

sql-server - 枢轴获取EAV数据

sql-server - 对于 SQL Server 2005 表来说,多少列过多?

sql - 使用动态列构建 SQL 查询

sql-server - ssis 派生列 - 检查日期字段是否为空

sql-server - SQL Server Tempdb 还原

sql-server - 从数据库中删除所有函数

sql-server - 函数计算已在真/假表达式中使用,该表达式用作不允许的表过滤器表达式

sql-server - 删除并重新创建所有约束结合 sp_MSForEachTable sql server

使用 Borland Delphi 远程查询 SQL Server 2005

sql-server - Red Gate SQL 比较 SDK 的替代品?