sql >> Database >  >> RDS >> Sqlserver

SQL Server 2005 - gegenereerde reeksen gebruiken in plaats van identiteitskolommen?

Ja, SQL 11 heeft SEQUENCE-objecten, zie SQL Server v.Next (Denali):SEQUENCE gebruiken .

Handmatige sequenties maken is mogelijk, maar wordt niet aanbevolen. De truc om een ​​sequentiegenerator te maken, is om UPDATE WITH OUTPUT op een sequentietabel te gebruiken. Hier is 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

Ik heb wat details weggelaten, maar dit is het algemene idee. Er is echter een enorm probleem:elke transactie die de volgende waarde op een reeks vraagt, wordt vergrendeld die reeks totdat deze wordt vastgelegd, omdat het een updatevergrendeling op de reekswaarde plaatst. Dit betekent dat alle transacties moeten na elkaar worden geserialiseerd bij het invoegen van waarden en de prestatievermindering die het gevolg is, is ondraaglijk in echte productie-implementaties.

Ik zou veel liever hebben dat je bij de IDENTITEIT-types blijft. Hoewel ze niet perfect zijn, zijn ze veel beter dan wat je alleen kunt bereiken.



  1. MySQL met Sequelize:ER_BAD_DB_ERROR:Onbekende database

  2. C++-programma verbinden met Oracle

  3. Voert de MySQL InnoDB-engine prestatie-optimalisatie uit voor alleen-lezen transacties?

  4. Hoe krijg ik de laatst ingevoerde ID?