SQL Server 2012 introduzido Sequence
como um novo recurso, igual ao Oracle e Postgres. Onde as sequências são preferidas às identidades? E por que precisamos de sequências?
sql
sql-server
tsql
sql-server-2012
Sleiman Jneidi
fonte
fonte
Respostas:
Eu acho que você encontrará sua resposta aqui
E aqui :
e aqui também:
e no msdn você também pode ler mais sobre o uso e por que precisamos dele ( aqui ):
fonte
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.
fonte
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:
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.
fonte
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.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.
fonte
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.
fonte
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.
fonte
IDENTITY
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