Estou usando colunas de identidade bigint em várias tabelas e noto que elas continuam pulando de números baixos para altos. Neste caso, de 17 a 1004, mas em outras tabelas até 10.000. Se esse comportamento continuar, estarei no limite de bigint em alguns milhares de registros! Por que isso está acontecendo e como posso corrigi-lo?
Captura de tela aqui:
Bigint varia de -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807. Eu acho que você tem um tempo antes de atingir os limites superiores - mesmo que esteja pulando 100 mil registros de uma vez, você pode ter um bilhão de saltos e ainda não raspar os limites superiores. Se você ainda está preocupado, refaça sua identidade para começar no intervalo negativo e estaremos todos mortos antes que você tenha que se preocupar com as coisas.
Por que um valor de identidade tem lacunas?
Um aplicativo tenta inserir um registro em sua tabela e um número é removido do pool. Por motivos de integridade referencial, a inserção falha ou o programa de chamada então desfaz (reverte) a inserção transacionada - de qualquer forma, o valor de identidade não está mais no pool de candidatos. Sim, mesmo que a transação seja revertida, o número esgotou e não é revertido.
Teste você mesmo
Na guia de resultados, você verá 1, 1, 3, 4 e 5, pois esses foram os números usados, mas como revertemos 4, os resultados confirmados da tabela #Demo serão exibidos
Eu não gosto desse comportamento
É assim que a propriedade de identidade funciona - não há como alterá-la. O mesmo vale se você alternar para o objeto Sequence (novo em 2012).
Se as lacunas forem uma preocupação, eu procuraria identificar qual processo as está consumindo. Se forem violações de integridade referencial (RI), aperte a validação antes de tentar salvar. Se a causa raiz for transações sendo revertidas, faça uma confirmação de duas fases ou algo parecido - Salvar em Stage.MyTable. Se o esgotamento da identidade for um problema, alterne para um objeto SEQUENCE e ative o ciclo. Periodicamente, pesquise esta tabela para transação confirmada e, em seguida, insira em dbo.MyTable a partir daí. Isso deve diminuir a oportunidade de existirem lacunas em sua chave substituta.
Kendra Little adorável pôster de nível de isolamento me ajuda a lembrar qual nível de isolamento eu preciso para verificar o que está realmente comprometido.