sql >> Database teknologi >  >> RDS >> Sqlserver

SQL Server 2005 - ved hjælp af genererede sekvenser i stedet for identitetskolonner?

Ja, SQL 11 har SEQUENCE-objekter, se SQL Server v.Next (Denali):Bruger SEQUENCE .

Det er muligt at oprette manuelle sekvenser, men det anbefales ikke. Tricket til at lave en sekvensgenerator er at bruge UPDATE WITH OUTPUT på en sekvenstabel. Her er pseudo-kode:

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

Jeg udelod nogle detaljer, men dette er den generelle idé. Der er dog et stort problem:enhver transaktion, der anmoder om den næste værdi i en sekvens, vil låse den sekvens, indtil den commiterer, fordi den vil placere en opdateringslås på sekvensværdien. Det betyder, at alle transaktioner skal serialiseres efter hinanden, når der indsættes værdier, og den præstationsforringelse, der resulterer, er uudholdelig i rigtige produktionsinstallationer.

Jeg vil meget hellere have, at du holder dig til IDENTITET-typerne. Selvom de ikke er perfekte, er de langt bedre end hvad du kan opnå på egen hånd.



  1. PDO vs pg_* funktioner

  2. Indlæs enorm csv-fil i Oracle-databasetabellen ved hjælp af Pyspark

  3. Problem med et kolonnenavn indeholder et kolon i PostgreSQL

  4. Hvordan kan jeg stoppe udførelse af sql-forespørgsler i php?