首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sql server 2008 newsequentialid()问题

sql server 2008 newsequentialid()问题
EN

Stack Overflow用户
提问于 2009-04-10 20:40:56
回答 6查看 8.2K关注 0票数 4

我在sql server management studio中遇到了newsequentialid()学习问题。创建一个具有唯一标识符列'UniqueID‘的表,并将默认值设置为newsequentialid()。

步骤1.保存设计:

'Table_1‘表-验证列'UniqueID’的默认值时出错。

无论如何,请保存它。

步骤2.查看sql:

代码语言:javascript
复制
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.添加一些行:

代码语言:javascript
复制
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中运行此命令会导致序列guids:

代码语言:javascript
复制
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');
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-04-10 20:58:29

newsequentialid主要是为了解决当您的表由唯一标识符聚类时的页面碎片问题。您的表由一个整数列组成群集。我设置了两个测试表,一个是newsequentialid列是主键,另一个不是(和您的一样),并且在主键中GUID始终是连续的。在另一种情况下,他们不是。

我不知道它为什么会有这种行为的内部原因/技术原因,但似乎很明显,newsequentialid()只有在表被它聚集时才是真正连续的。除此之外,它的行为看起来类似于newid() / RowGuid。

另外,我很好奇为什么你会想要使用newsequentialid(),而你不需要这样做。它有许多newid()没有的缺点,也没有任何好处-最大的缺点是newid()不可预测,而newsequentialid()则是。如果你不担心碎片化,那还有什么意义呢?

票数 4
EN

Stack Overflow用户

发布于 2012-05-03 20:20:15

根据NEWSEQUENTIALID()的the definition,这些值实际上是“连续的”:

创建的GUID大于自Windows启动以来此函数在指定计算机上以前生成的任何GUID。

它并不是说在GUID中不能有任何间隙,只是任何新的GUID都应该大于以前的GUID。

试试这个:

代码语言:javascript
复制
create table #test(id int, txt varchar(50), gid uniqueidentifier)

insert into #test
select 1    ,'test','72b48f77-0e26-de11-acd4-001bfc39ff92'
union select 2,    'test2', '92f0fc8f-0e26-de11-acd4-001bfc39ff92'
union select 3,    'test3', '122aa19b-0e26-de11-acd4-001bfc39ff92'

select * from #test
order by gid asc

如您所见,记录的顺序为1、2、3,这与预期不谋而合。

票数 4
EN

Stack Overflow用户

发布于 2013-12-21 01:12:28

它们是连续的!

代码语言:javascript
复制
1    test     72b48f77-0e26-de11-acd4-001bfc39ff92
2    test2    92f0fc8f-0e26-de11-acd4-001bfc39ff92
3    test3    122aa19b-0e26-de11-acd4-001bfc39ff92

77 < 8f < 9b!你必须看到最高的值,而不是最低的(从右到左)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/738801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档