SQL Server 2005 - 使用生成的序列而不是Identity列?

Cav*_*rob 1 identity sql-server-2005 sequence

我真的在考虑切换SQL Server 2005中的Identity列并使用某种类型的序列生成器(据我所知,2005年没有内置任何内容;可能会在2011年出现?)以获得唯一的id用于插入的行.

是否有模型实施或最佳实践?我会遇到锁定问题吗?与仅使用Identity列相比,有哪些缺点?

Rem*_*anu 5

是的,SQL 11有SEQUENCE对象,请参阅SQL Server v.Next(Denali):使用SEQUENCE.

可以创建手动序列,但不建议这样做.执行序列生成器的技巧是在序列表上使用UPDATE WITH OUTPUT.这是伪代码:

CREATE TABLE Sequences (
    Name sysname not null primary key, 
    Sequence bigint not null default 0);
GO

CREATE PROCEDURE sp_getSequence
    @name sysname,
    @value bigint output
AS
    UPDATE Sequences
    SET Sequence = Sequence + 1
     OUTPUT @value = INSERTED.Sequence
    WHERE Name = @name;
GO
Run Code Online (Sandbox Code Playgroud)

我遗漏了一些细节,但这是一般的想法.但是,存在一个巨大的问题:任何请求序列上的下一个值的事务都将锁定该序列,直到它提交为止,因为它将对序列值进行更新锁定.这意味着在插入值时,所有事务都必须相互序列化,并且在实际生产部署中导致性能降低,这是无法忍受的.

我宁愿让你坚持使用IDENTITY类型.虽然并不完美,但它们远比你自己实现的要好得多.