Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

O incremento de identidade está saltando no banco de dados SQL Server


Você está encontrando esse comportamento devido a uma melhoria de desempenho desde o SQL Server 2012.

Agora, por padrão, usa um tamanho de cache de 1.000 ao alocar IDENTITY valores para um int coluna e reiniciar o serviço pode "perder" valores não utilizados (O tamanho do cache é 10.000 para bigint /numeric ).

Isso é mencionado na documentação

O SQL Server pode armazenar valores de identidade em cache por motivos de desempenho e alguns dos valores atribuídos podem ser perdidos durante uma falha de 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 deverá usar seu próprio mecanismo para gerar valores de chave. Usando um gerador de sequência com o NOCACHE opção pode limitar as lacunas para transações que nunca são confirmadas.

A partir dos dados que você mostrou, parece que isso aconteceu após a entrada de dados de 22 de dezembro e, quando reiniciado, o SQL Server reservou os valores 1206306 - 1207305 . Após a entrada de dados de 24 a 25 de dezembro foi feita outra reinicialização e o SQL Server reservou o próximo intervalo 1207306 - 1208305 visível nas entradas para o dia 28.

A menos que você esteja reiniciando o serviço com frequência incomum, é improvável que quaisquer valores "perdidos" causem qualquer diferença significativa no intervalo de valores permitidos pelo tipo de dados, portanto, a melhor política é não se preocupar com isso.

Se isso for, por algum motivo, um problema real para você, algumas possíveis soluções alternativas são ...
  1. Você pode usar uma SEQUENCE em vez de uma coluna de identidade e defina um tamanho de cache menor, por exemplo, e use NEXT VALUE FOR em um padrão de coluna.
  2. Ou aplique o sinalizador de rastreamento 272 que torna a IDENTITY alocação registrada como nas versões até 2008 R2. Isso se aplica globalmente a todos os bancos de dados.
  3. Ou, para versões recentes, execute ALTER DATABASE SCOPED CONFIGURATION SET IDENTITY_CACHE = OFF para desabilitar o cache de identidade para um banco de dados específico.

Você deve estar ciente de que nenhuma dessas soluções alternativas garante ausência de lacunas. Isso nunca foi garantido por IDENTITY pois só seria possível serializando as inserções na tabela. Se você precisar de uma coluna sem intervalos, precisará usar uma solução diferente de IDENTITY ou SEQUENCE