Sequência vs identidade

87

SQL Server 2012 introduzido Sequencecomo um novo recurso, igual ao Oracle e Postgres. Onde as sequências são preferidas às identidades? E por que precisamos de sequências?

Sleiman Jneidi
fonte
Depois de usar ambos, prefiro Identity para uso global em um banco de dados. Ou seja, onde você precisa de um número de incremento automático como ObjectID e deseja usá-lo em muitas tabelas. É complicado fazer uma sequência e, em seguida, usar um aplicativo (site ou aplicativo, etc.) para gerenciar a inserção e atualização de tabelas com base em um número de sequência.
volume um de

Respostas:

81

Eu acho que você encontrará sua resposta aqui

Usando o atributo de identidade para uma coluna, você pode gerar facilmente números de incremento automático (que costumam ser usados ​​como uma chave primária). Com Sequence, será um objeto diferente que você pode anexar a uma coluna da tabela durante a inserção. Ao contrário da identidade, o próximo número para o valor da coluna será recuperado da memória e não do disco - isso torna a Sequência significativamente mais rápida do que a Identidade. Veremos isso nos próximos exemplos.

E aqui :

Sequências: as sequências são solicitadas pela comunidade do SQL Server há anos e estão incluídas nesta versão. Sequência é um objeto definido pelo usuário que gera uma sequência de um número. Aqui está um exemplo usando Sequence.

e aqui também:

Um objeto de sequência do SQL Server gera uma sequência de números exatamente como uma coluna de identidade em tabelas sql. Mas a vantagem dos números de seqüência é que o objeto de número de seqüência não é limitado a uma única tabela sql.

e no msdn você também pode ler mais sobre o uso e por que precisamos dele ( aqui ):

Uma sequência é um objeto vinculado ao esquema definido pelo usuário que gera uma sequência de valores numéricos de acordo com a especificação com a qual a sequência foi criada. A sequência de valores numéricos é gerada em ordem crescente ou decrescente em um intervalo definido e pode circular (repetir) conforme solicitado. As sequências, ao contrário das colunas de identidade, não são associadas às tabelas. Um aplicativo se refere a um objeto de sequência para receber seu próximo valor. O relacionamento entre sequências e tabelas é controlado pelo aplicativo. Os aplicativos do usuário podem fazer referência a um objeto de sequência e coordenar as chaves de valores em várias linhas e tabelas.

Uma sequência é criada independentemente das tabelas usando a instrução CREATE SEQUENCE. As opções permitem controlar o incremento, valores máximos e mínimos, ponto de partida, capacidade de reinicialização automática e armazenamento em cache para melhorar o desempenho. Para obter informações sobre as opções, consulte CREATE SEQUENCE.

Ao contrário dos valores da coluna de identidade, que são gerados quando as linhas são inseridas, um aplicativo pode obter o próximo número de sequência antes de inserir a linha chamando a função NEXT VALUE FOR. O número de sequência é alocado quando NEXT VALUE FOR é chamado, mesmo que o número nunca seja inserido em uma tabela. A função NEXT VALUE FOR pode ser usada como o valor padrão para uma coluna em uma definição de tabela. Use sp_sequence_get_range para obter um intervalo de vários números de sequência de uma vez.

Uma sequência pode ser definida como qualquer tipo de dados inteiro. Se o tipo de dados não for especificado, o padrão de uma sequência será bigint.

Arion
fonte
21

A sequência e a identidade são usadas para gerar a numeração automática, mas a principal diferença é que a identidade depende da tabela e a sequência é independente da tabela.

Se você tem um cenário em que precisa manter um número automático globalmente (em várias tabelas), também precisa reiniciar seu intervalo após um determinado número e precisa armazená-lo em cache também para desempenho, aqui é o lugar onde precisamos da sequência e não identidade.

user1059637
fonte
14

Embora as sequências forneçam mais flexibilidade do que as colunas de identidade, não achei que elas tivessem nenhum benefício de desempenho.

Eu descobri que o desempenho usando a identidade foi 3x mais rápido do que usando a sequência para inserções em lote.

Inseri aproximadamente 1,5 milhão de linhas e o desempenho foi:

  • 14 segundos para identidade
  • 45 segundos para a sequência

Inseri as linhas em uma tabela que usou objeto de sequência por meio de um padrão de tabela:

NEXT VALUE for <seq> for <col_name>

e também tentou especificar o valor de sequência na instrução select:

SELECT NEXT VALUE for <seq>, <other columns> from <table>

Ambos eram o mesmo fator mais lento do que o método de identidade. Usei a opção de cache padrão para a sequência.

O artigo referenciado no primeiro link de Arion mostra o desempenho para inserção linha por linha e a diferença entre identidade e sequência foi de 16,6 segundos a 14,3 segundos para 10.000 inserções.

A opção de armazenamento em cache tem um grande impacto no desempenho, mas a identidade é mais rápida para volumes maiores (+ 1 milhão de linhas)

Veja este link para uma análise aprofundada de acordo com o comentário de utly4life.

Stagg
fonte
Qual era o tamanho do cache da sequência.
Shannon Severance
50, aumentar faz diferença, mas me lembro que a identidade ainda era mais rápida.
Stagg
2
byobi.com/blog/2012/09/… Fornece uma boa comparação detalhada de várias configurações. Mostra que o aumento no tamanho do cache de 50 para 500 resultou em uma diferença de velocidade de aproximadamente 2x.
ulty4life
1
Você está sugerindo que as sequências são mais lentas do que a coluna de identidade? Tive uma impressão oposta, pois as sequências estão na memória, ao contrário da identidade que é obtida do disco. Suas descobertas são bastante surpreendentes. Que bom que você compartilhou.
RBT
1
com a sequência, você pode otimizar o desempenho da inserção de lote usando alter sequence increment by ...para simplesmente abrir espaço para suas novas linhas e, em seguida, usar base + número_da_linha () ou qualquer outro para os valores reais.
gordy
6

Eu sei que isso é um pouco antigo, mas queria acrescentar uma observação que me mordeu.

Troquei de identidade para sequência para ter meus índices em ordem. Mais tarde descobri que a sequência não é transferida com a replicação. Comecei a receber violações importantes depois de configurar a replicação entre dois bancos de dados, pois as sequências não estavam sincronizadas. apenas algo para estar atento antes de tomar uma decisão.

Ken
fonte
3

Acho que o melhor uso de Sequências não é substituir uma coluna de identidade, mas criar um tipo de campo "Número do pedido".

Em outras palavras, um número de pedido é exposto ao usuário final e pode ter regras de negócios junto com ele. Você quer que seja único, mas apenas usar uma coluna de identidade também não é realmente correto.

Por exemplo, diferentes tipos de pedidos podem exigir uma sequência diferente, portanto, você pode ter uma sequência para Pedidos pela Internet, em vez de pedidos internos.

Em outras palavras, não pense em uma Sequência como um simples substituto para a identidade, pense nela como sendo útil nos casos em que uma identidade não atende aos requisitos de negócios.

Greg Gum
fonte
1

Recentemente, algo a ser considerado para identidade vs sequência. Parece que a MSFT agora sugere a sequência se você quiser manter a identidade sem lacunas. Tivemos um problema em que havia grandes lacunas na identidade, mas com base nessa declaração destacada explicaria nosso problema de que o SQL armazenou a identidade em cache e após a reinicialização perdemos esses números.

https://docs.microsoft.com/en-us/sql/t-sql/statements/create-table-transact-sql-identity-property?view=sql-server-2017

Valores consecutivos após a reinicialização do servidor ou outras falhas - o SQL Server pode armazenar em cache os valores de identidade por motivos de desempenho e alguns dos valores atribuídos podem ser perdidos durante uma falha do banco de dados ou reinicialização do servidor. Isso pode resultar em lacunas no valor de identidade na inserção. Se as lacunas não forem aceitáveis, o aplicativo deve usar seu próprio mecanismo para gerar valores-chave. Usar um gerador de sequência com a opção NOCACHE pode limitar os intervalos para transações que nunca são confirmadas.

Awilbourn
fonte
1
Há uma boa resposta para o motivo de você estar pulando o link deIDENTITY números e tem o mesmo problema do link descrito aqui, mas você pode limitá-lo definindo um tamanho de CACHE menor, mas aí há uma compensação com a velocidade. SEQUENCE
Mrphin