Gap (pulo) no Identity, como evitar?

Desde o SQL Server 2012, o produto sofreu uma alteração no controle dos campos IDENTITY onde, logo na inicialização da instância, ele coloca em cache aproximadamente 1000 registros para agilizar o processo. Ao fazer isso, o identity é “pré-usado” internamente e o SQL se encarrega de entregar os próximos valores.

O ‘problema’ é que, ao reinicializar a instância, o cache é perdido e ele cria um gap desses registros não utilizados.

Veja:

Isso foi tema de diversas discussões no Fórum MSDN na época que eu participava dele… Por que? Porque muita gente usa o campo identity como uma chave de negócio (código do produto, por exemplo), e quando algo assim ocorre, aquela sequência “se perde” e “fica feio” no sistema esse pulo.

Existiu, inclusive um Connect Item para que isso fosse resolvido. E foi. Desde então, existe a trace flag 272, que faz com que essa reserva pare de ser executada e a sequência se mantenha:

Mas notem que: Isso é uma alteração para toda a instância. Para fazer isso por banco, só a partir do SQL Server 2017, usando o SCOPED CONFIGURATION. Vejam:

Em tempo: Estou usando o dbatools.io via Posh para os cmdlets e o docker, ao invés de VM ou instalando localmente.

[]’s!

Deixe uma resposta

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.