Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server 2005 - Verwenden von generierten Sequenzen anstelle von Identitätsspalten?

Ja, SQL 11 hat SEQUENCE-Objekte, siehe SQL Server v.Next (Denali):Verwendung von SEQUENCE .

Das Erstellen manueller Sequenzen ist möglich, wird jedoch nicht empfohlen. Der Trick bei der Erstellung eines Sequenzgenerators besteht darin, UPDATE WITH OUTPUT für eine Sequenztabelle zu verwenden. Hier ist Pseudo-Code:

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

Ich habe einige Details ausgelassen, aber das ist die allgemeine Idee. Es gibt jedoch ein großes Problem:Jede Transaktion, die den nächsten Wert in einer Sequenz anfordert, wird gesperrt diese Sequenz, bis sie festgeschrieben wird, da sie den Sequenzwert mit einer Aktualisierungssperre belegt. Das bedeutet, dass alle Transaktionen müssen beim Einfügen von Werten nacheinander serialisiert werden, und der daraus resultierende Leistungsabfall ist in realen Produktionsumgebungen unerträglich.

Mir wäre viel lieber, wenn Sie bei den IDENTITY-Typen bleiben. Sie sind zwar nicht perfekt, aber weitaus besser als das, was Sie alleine erreichen können.