Eu tenho uma tabela criada com o seguinte T-SQL:
CREATE TABLE [dbo].[TableName](
[id] [int] IDENTITY(1,1) NOT NULL
PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
Dei uma olhada nesta tabela hoje e notei que a coluna id estava pulando valores:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 2034, 2035, 3034
Não estou preocupado com isso ou qualquer coisa (minha aplicação não se importa com qual é a chave primária), estava apenas curioso sobre o que pode causar isso. Parece que há uma espécie de padrão, de pular 1000 toda vez que um "salto" acontece.
Meu aplicativo usando o framework de entidade para inserir essas linhas, se isso fizer alguma diferença.
Existem muitas coisas que podem causar lacunas em uma coluna IDENTITY (rollbacks, deletes), mas neste caso devido ao salto suspeito que seja esse bug - causado pelas alterações em IDENTITY com a introdução de SEQUENCE:
Então, aposto que, se você olhar nos logs de erros do SQL Server, as linhas associadas a esses saltos foram inseridas logo após a reinicialização do serviço SQL Server, um banco de dados foi desanexado/reanexado etc.
Realmente, porém, por que você se importa com as lacunas? Você não deveria . Se você precisar de uma sequência contígua de números, pare de usar IDENTITY.
Quando as inserções são revertidas, os valores de identidade NÃO são redefinidos. Esta é uma explicação dos chamados valores "ignorados".
Eu sei que minha resposta pode demorar. Sim, isso costumava acontecer quando o SQL Server era reiniciado. Veja aqui para obter mais informações (conforme fornecido em outras respostas). Com o SQL Server 2014, ele foi corrigido (a identidade não será aumentada em 1000) somente se houver uma reinicialização planejada do SQL Server.
Eu resolvi de outra maneira adicionando um procedimento armazenado de inicialização no SQL Server 2012.
Crie um procedimento armazenado a seguir no banco de dados mestre.
Em seguida, adicione-o ao Start up usando a seguinte sintaxe.
Esta é uma boa idéia se você tiver poucas mesas. mas se você tiver que fazer para muitas tabelas, esse método ainda funciona, mas não é uma boa ideia.