sql >> Databáze >  >> RDS >> Sqlserver

SQL Server 2005 – používáte vygenerované sekvence místo sloupců identity?

Ano, SQL 11 má objekty SEQUENCE, viz SQL Server v.Next (Denali) :Použití SEQUENCE .

Vytváření ručních sekvencí je možné, ale nedoporučuje se. Trik, jak vytvořit sekvenční generátor, je použít UPDATE WITH OUTPUT v tabulce sekvencí. Zde je pseudokód:

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

Vynechal jsem některé detaily, ale toto je obecná myšlenka. Je zde však obrovský problém:jakákoli transakce požadující další hodnotu v sekvenci se uzamkne tuto sekvenci, dokud se nepotvrdí, protože na hodnotu sekvence umístí aktualizační zámek. To znamená, že všechny transakce se musí při vkládání hodnot serializovat jedna po druhé a výsledná degradace výkonu je v reálném produkčním nasazení neúnosná.

Mnohem raději bych byl, abyste zůstal u typů IDENTITY. I když nejsou dokonalé, jsou mnohem lepší než to, čeho můžete dosáhnout sami.



  1. PHP nemůže za určitých okolností vyřešit název kontejneru mysql

  2. SQLite a inicializace databáze

  3. dotaz extrémně pomalý po migraci na mysql 5.7

  4. SQL efektivní algoritmus generování rozvrhu