Em sua resposta para o que é melhor: colunas de identidade ou valores de ID exclusivos gerados? mrdenny diz:
Quando o SQL Denali for lançado, ele oferecerá suporte a seqüências que serão mais eficientes que a identidade, mas você não poderá criar algo mais eficiente.
Eu não tenho tanta certeza. Conhecendo as seqüências do Oracle , eu tenho que criar um gatilho para inserção, encapsular cada inserção em uma chamada de um procedimento armazenado ou orar para que eu não esqueça de usar corretamente a sequência quando fizer uma inserção ad-hoc.
Duvido que as vantagens das sequências sejam tão óbvias.
sql-server
sql-server-2012
sequence
bernd_k
fonte
fonte
Respostas:
Eu vou responder aqui também. Tem a ver com os aspectos internos de como
IDENTITY
eSEQUENCE
trabalhar.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 obter detalhes. Conforme 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 SQL Server permite definir o tamanho do cache. Embora o SQL Server não mantenha os valores no cache, ele mantém apenas o valor atual e o valor final superior, mas isso 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, quaisquer 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:
fonte
Desde que o artigo de Itzik Ben Gan foi escrito, o tamanho do cache codificado de 10 para
IDENTITY
parece ter sido alterado. Dos comentários neste item de conexãoO livro de consulta T-SQL contém a tabela a seguir, mas enfatiza que esses valores não são documentados ou não são alterados.
O artigo aqui testa vários tamanhos de cache de sequência e insere tamanhos de lote e apresenta os seguintes resultados.
O que parece mostrar que as inserções grandes
IDENTITY
são executadasSEQUENCE
. Porém, ele não testa o tamanho do cache 1.000 e esses resultados são apenas um teste. Analisando especificamente 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 como abaixo - sempre em µs).Para lotes maiores, a
IDENTITY
versão geralmente parece mais rápida .O livro TSQL Querying também explica por que
IDENTITY
pode ter uma vantagem de desempenho sobre a sequência.A
IDENTITY
tabela é específica eSEQUENCE
não é. Se o desastre ocorreu no meio da inserção antes da liberação do buffer de log, não importa se a identidade recuperada é anterior, pois o processo de recuperação também desfaz a inserção, portanto, o SQL Server não força a liberação do buffer de log em todas as identidades. gravação em disco relacionada ao cache. No entanto, para Sequência, isso é imposto, 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, esse é um milhar adicional de liberações de log.Script para reproduzir
fonte