SQL 2011 – Sequences

Picture of Equipe Tripletech

Equipe Tripletech

Resumo Executivo: O objeto SEQUENCE no SQL Server é um gerador de números independente de tabelas, ideal para cenários em que você precisa de um identificador compartilhado entre múltiplas entidades (ex.: Cliente e Funcionário) sem recorrer a “truques” com IDENTITY, GUIDs ou chaves compostas. Introduzido no SQL Server 2012, ele permite controlar início, incremento, mínimo/máximo, cache e ciclo, além de obter o próximo valor com NEXT VALUE FOR — inclusive antes do INSERT.

Pontos-chave

  • SEQUENCE: gera números fora do escopo da transação — o valor é consumido mesmo em ROLLBACK.
  • Independente de tabelas: diferente de IDENTITY, pode alimentar várias tabelas com o mesmo gerador.
  • NEXT VALUE FOR: obtém o próximo número sem precisar inserir linha, útil para “pré-alocar” IDs.
  • Cache & gaps: cache melhora performance, mas pode gerar lacunas em shutdown inesperado e em números solicitados e não usados.

SQL

SQL Server SEQUENCE: como gerar IDs compartilhados (e evitar armadilhas do IDENTITY)

Por muitos anos, modelagens que exigiam um identificador numérico compartilhado entre tabelas (por exemplo, um “Cadastro” comum para Cliente e Funcionário) acabavam dependendo de alternativas pouco elegantes: chaves compostas, GUIDs (UNIQUEIDENTIFIER) ou até “par/ímpar” com IDENTITY. A partir do SQL Server 2012, o objeto SEQUENCE simplifica esse cenário com um gerador central de números.

O que é SEQUENCE (e por que ele muda o jogo)

SEQUENCE é um objeto definido pelo usuário e associado a um schema que gera uma sequência de valores numéricos conforme regras (início, incremento, limites, ciclo e cache). Diferente de IDENTITY, ele não está preso a uma tabela: a aplicação (ou seu SQL) chama a sequência e decide onde usar o número, inclusive em várias tabelas.

Por que “truques” antigos eram problemáticos

  • Chave composta: aumenta complexidade, consumo de armazenamento e dificulta consultas/joins e manutenção.
  • UNIQUEIDENTIFIER + NEWID(): melhora unicidade, mas torna chaves “grandes” e pouco legíveis.
  • IDENTITY par/ímpar: confunde auditoria e manutenção; deleções e assimetrias de inserts criam lacunas e padrões estranhos.

Comparativo: SEQUENCE vs alternativas

Abordagem Prós Contras Melhor uso
IDENTITY Simples; automático no INSERT Amarrado à tabela; não “coordena” IDs entre tabelas PK por tabela, sem necessidade de compartilhamento
SEQUENCE Independente de tabelas; pode obter ID antes do INSERT; controla min/max, ciclo e cache Valor é consumido fora da transação (pode “perder” número em rollback) IDs compartilhados entre tabelas; numeração centralizada
UNIQUEIDENTIFIER Unicidade global; bom para integrações distribuídas Mais pesado; menos legível; pode impactar indexação dependendo do padrão Sistemas distribuídos, merge replication, integrações multi-site
Chave composta Modelagem “pura” em alguns cenários Complexa; aumenta colunas em FK/índices; dificulta manutenção Casos onde a natural key é estável e pequena
IDENTITY par/ímpar Evita colisão numérica entre duas tabelas Dados confusos; lacunas e manutenção difícil Evite (há opções melhores)

Como criar uma SEQUENCE no SQL Server

A criação é feita com CREATE SEQUENCE, definindo tipo, início, incremento e limites. Exemplo “clássico” (incremento de 1, sem limite máximo explícito):

CREATE SEQUENCE dbo.CadastroSeq
AS INT
START WITH 1
INCREMENT BY 1
MINVALUE 1
NO MAXVALUE
NO CYCLE
CACHE 50;

Observação importante: o cache pode melhorar performance ao reduzir I/O, mas em desligamentos inesperados você pode perder números que ficaram em memória (o que gera lacunas).

Aplicando a SEQUENCE para “Cliente” e “Funcionário” (ID compartilhado)

A grande vantagem é centralizar a numeração. Veja um exemplo didático (simplificado):

-- Tabelas de exemplo
CREATE TABLE dbo.Cliente (
  CadastroId INT NOT NULL PRIMARY KEY,
  Nome       NVARCHAR(120) NOT NULL
);

CREATE TABLE dbo.Funcionario (
  CadastroId INT NOT NULL PRIMARY KEY,
  Nome       NVARCHAR(120) NOT NULL
);

-- Sequência compartilhada
CREATE SEQUENCE dbo.CadastroSeq
AS INT
START WITH 1
INCREMENT BY 1
MINVALUE 1
NO MAXVALUE
NO CYCLE
CACHE 50;

-- Inserts usando o próximo valor da sequência
INSERT INTO dbo.Cliente (CadastroId, Nome)
VALUES (NEXT VALUE FOR dbo.CadastroSeq, N'Fabrizzio');

INSERT INTO dbo.Funcionario (CadastroId, Nome)
VALUES (NEXT VALUE FOR dbo.CadastroSeq, N'Caputo');

O comando NEXT VALUE FOR permite obter o próximo número de forma explícita — inclusive sem inserir uma linha imediatamente.

Reservando ranges: quando você precisa “pré-alocar” blocos

Em cenários de alta concorrência, integração ou geração em lote, pode ser útil reservar um intervalo de valores. O SQL Server permite obter múltiplos números com sp_sequence_get_range.

Gerenciamento: ALTER SEQUENCE (reiniciar, mudar incremento, limites, cache)

Um benefício operacional é ajustar a sequência sem recriar tudo: você pode alterar propriedades e até reiniciar conforme necessidade (por exemplo, depois de uma carga).

-- Exemplo: reiniciar para 100000 (cuidado com colisões)
ALTER SEQUENCE dbo.CadastroSeq
RESTART WITH 100000;

-- Exemplo: mudar cache (impacta performance vs risco de gaps em shutdown)
ALTER SEQUENCE dbo.CadastroSeq
CACHE 200;

Armadilha crítica: SEQUENCE não “volta” com ROLLBACK

Aqui está a principal diferença comportamental que pega muita gente: números de SEQUENCE são gerados fora do escopo da transação. Isso significa que o valor é consumido mesmo que sua transação seja revertida.

CREATE SEQUENCE dbo.SeqTeste
AS INT
START WITH 1
INCREMENT BY 1
NO CYCLE
NO CACHE;

BEGIN TRAN;
  SELECT NEXT VALUE FOR dbo.SeqTeste AS PrimeiroValor; -- 1
ROLLBACK;

SELECT NEXT VALUE FOR dbo.SeqTeste AS SegundoValor; -- 2 (não volta para 1)

Além disso, lacunas também podem ocorrer se valores forem solicitados e não usados, e com cache em casos de desligamento inesperado.

Boas práticas para usar SEQUENCE com segurança

  • Não prometa “sem lacunas”: trate SEQUENCE como gerador de unicidade/ordem, não como “contador perfeito” (gaps são esperados em cenários reais).
  • Escolha o tipo correto: BIGINT como padrão é comum; INT pode ser suficiente, mas valide crescimento.
  • Defina cache conscientemente: cache melhora performance; NO CACHE reduz risco de gaps em shutdown, mas aumenta I/O.
  • Evite colisões: ao reiniciar (RESTART), assegure que não há valores já usados nas tabelas alvo.

Gibi de Entidades e Termos (SQL Server SEQUENCE)

SEQUENCE:
Objeto que gera valores numéricos conforme uma especificação (início, incremento, min/max, ciclo e cache), independente de tabelas.
NEXT VALUE FOR:
Expressão que retorna o próximo valor de uma SEQUENCE, inclusive sem realizar INSERT.
CACHE / NO CACHE:
CACHE melhora performance pré-alocando valores; pode gerar lacunas em shutdown inesperado. NO CACHE grava a cada uso (mais I/O) e reduz o risco de gaps por desligamento, mas não elimina gaps por valores solicitados e não usados.
CYCLE / NO CYCLE:
Define se a SEQUENCE reinicia ao atingir o limite (min/max). Em CYCLE, reinicia no mínimo (ou máximo em sequência descendente), não no START.
sp_sequence_get_range:
Procedimento para reservar múltiplos números de uma SEQUENCE de uma vez (útil para lotes e alta concorrência).

Onde se aprofundar (fonte oficial)

Para sintaxe completa, opções e observações de comportamento (transação, cache e lacunas), consulte a documentação oficial: CREATE SEQUENCE (Transact-SQL) – Microsoft Learn.

Se você está padronizando governança, performance e segurança no seu ambiente SQL Server (backup, monitoramento e boas práticas operacionais), vale olhar também os serviços gerenciados de TI da Tripletech e, se preferir, falar com um especialista para desenhar uma estratégia consistente do banco até a camada de infraestrutura.

Perguntas Frequentes

1) SEQUENCE substitui IDENTITY em qualquer caso?

Não necessariamente. IDENTITY continua ótimo quando o ID é exclusivo por tabela e você quer simplicidade no INSERT. SEQUENCE brilha quando você precisa coordenar IDs entre tabelas, obter o número antes do INSERT e controlar propriedades como min/max, ciclo e cache.

2) Posso garantir que não haverá lacunas?

Em prática, não. A própria documentação ressalta que números são consumidos fora da transação (mesmo com rollback) e que cache/shutdown e números solicitados e não usados podem gerar gaps.

3) SEQUENCE é transacional?

Não. Os números são gerados fora do escopo da transação e são consumidos independentemente de commit/rollback.

4) CACHE vale a pena?

Muitas vezes sim, por performance (menos I/O). Porém, considere o risco de lacunas em caso de falha/queda inesperada do servidor e o seu nível de exigência com a “contagem”.

5) Em qual versão do SQL Server isso existe?

O objeto SEQUENCE foi introduzido no SQL Server 2012.

Sua operação não pode parar. Proteja seu negócio hoje.

Se o seu ambiente SQL Server sustenta faturamento, atendimento ou integrações críticas, uma decisão simples (como padronizar SEQUENCE, backup, políticas de retenção e monitoramento) pode reduzir incidentes, acelerar troubleshooting e aumentar disponibilidade. A Tripletech ajuda a organizar boas práticas e operar seu TI com previsibilidade — do banco à infraestrutura.

Fale com um Especialista no WhatsApp