Em sua resposta para Qual é o melhor: colunas de identidade ou valores de id únicos gerados? mrdenny disse:
Quando o SQL Denali for lançado, ele oferecerá suporte a sequências que serão mais eficientes que a identidade, mas você não pode criar algo mais eficiente sozinho.
Eu não tenho tanta certeza. Conhecendo as sequências do Oracle , tenho que criar um gatilho para inserção, encapsular cada inserção em uma chamada de procedimento armazenado ou rezar para não esquecer de usar corretamente a sequência quando fizer uma inserção ad-hoc.
Duvido que as vantagens das sequências sejam tão óbvias.
Vou responder aqui também. Tem a ver com os aspectos internos de como
IDENTITY
eSEQUENCE
trabalho.Com
IDENTITY
, o SQL Server pré-armazena em cache os valores na memória para que estejam prontamente disponíveis. Veja a resposta de Martin Smith para os detalhes. À medida que os valores são usados, um processo em segundo plano gera mais valores. Como você pode imaginar, esse pool pode acabar rapidamente, deixando o aplicativo à mercê do processo em segundo plano que está gerando os valores.Com
SEQUENCE
o , o SQL Server permite definir o tamanho que o cache deve ter. Embora o SQL Server não mantenha realmente os valores no cache, ele apenas mantém o valor atual e o valor final superior, o que reduzirá bastante a quantidade de E/S necessária para criar valores.Não defina o cache muito alto, pois isso reduzirá o número de números que podem ser usados: se o SQL Server travar, todos os valores especificados no intervalo de cache atual que não foram usados serão perdidos.
Quanto à inserção de linha, basta especificar um valor padrão para a coluna, assim:
Desde que o artigo Itzik Ben Gan foi escrito, o tamanho do cache codificado de 10 para
IDENTITY
parece ter sido alterado. Dos comentários sobre este item de conexãoO livro T-SQL Query contém a tabela a seguir, mas enfatiza que esses valores não estão documentados ou garantidos como inalterados.
O artigo aqui testa vários tamanhos de cache de sequência e tamanhos de lote de inserção e apresenta os seguintes resultados.
O que parece mostrar que, para grandes inserções
IDENTITY
, o desempenho éSEQUENCE
. No entanto, ele não testa o tamanho do cache 1.000 e também esses resultados são apenas um teste. Olhando especificamente para o tamanho do cache 1.000 com vários tamanhos de lote de inserções, obtive os seguintes resultados (tentando cada tamanho de lote 50 vezes e agregando os resultados conforme abaixo - todos os tempos em μs).Para tamanhos de lote maiores, a
IDENTITY
versão geralmente parece mais rápida .O livro TSQL Query também explica por que
IDENTITY
pode ter uma vantagem de desempenho sobre a sequência.O
IDENTITY
é específico da tabela eSEQUENCE
não é. Se o desastre ocorreu no meio da inserção antes que o buffer de log fosse liberado, não importa se a identidade recuperada é anterior, pois o processo de recuperação também desfará a inserção, portanto, o SQL Server não forçará a liberação do buffer de log em cada identidade gravação de disco relacionada ao cache. No entanto, para Sequência, isso é aplicado, pois o valor pode ser usado para qualquer finalidade - inclusive fora do banco de dados. Portanto, no exemplo acima, com um milhão de inserções e tamanho de cache de 1.000, são mil liberações de log adicionais.Script para reproduzir