AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 284254
Accepted
Dirk Boer
Dirk Boer
Asked: 2021-01-30 03:11:43 +0800 CST2021-01-30 03:11:43 +0800 CST 2021-01-30 03:11:43 +0800 CST

Como não há unsigned int no SQL Server, uma semente de identidade de -2.147.483.648 não faz mais sentido para tabelas grandes?

  • 772

Acabei de pensar que a Semente de Identidade padrão é 1. Tenho algumas tabelas que sei que chegarão aos bilhões em um certo ponto. Não faria mais sentido começar em int.Min(-2.147.483.648) para essas tabelas?

Isso pode fazer a diferença de migrar sua chave para bigintem 4 anos ou em 8 anos. Pode ser relevante o suficiente.

Isso é comum? Parece estranho. Existe alguma coisa que eu estou perdendo?

sql-server identity
  • 2 2 respostas
  • 1367 Views

2 respostas

  • Voted
  1. Best Answer
    David Spillett
    2021-01-30T03:38:34+08:002021-01-30T03:38:34+08:00

    Não há nada de errado em começar em -2.147.483.648 no que diz respeito ao SQL Server. Começar em 2.147.483.647 e contar de trás para frente IDENTITY(2147483647,-1)também é perfeitamente válido.

    Coisas que me fariam desconfiar de fazê-lo:

    1. Pode confundir as pessoas que não esperam ver valores negativos em tais posições. É incomum o suficiente para que possa facilmente parecer um bug. Se nada mais você pode ficar cansado de explicar isso.
    2. Se você passar os IDs para outros serviços por qualquer motivo, eles podem falhar na validação de entrada para esse código sem esperar ver negativos (um sistema externo não deve se preocupar com seus IDs internos assim, mas há muitas coisas que acontecem que devem não!). Além disso, o código em outras camadas do seu aplicativo pode usar um int32 não assinado, tornando a opção "down from int.max" ainda mais perigosa, pois você não atingirá o problema até cair abaixo de 0.
    3. As pessoas às vezes usam números mágicos negativos para ter um significado especial, e isso pode causar colisões que levam a erros difíceis de explicar. Por exemplo, encurtar WHERE (x.a<>y.a OR x.a IS NULL AND y.a IS NOT NULL OR x.a IS NOT NULL AND y.a IS NULL)para WHERE ISNULL(x.a,-1)<>ISNULL(x.a,-2)é algo que já vi várias vezes. Não é provável para o seu PK, pois isso nunca será, NULLmas pode acontecer na comparação de valores de FK em outras tabelas. Eu até vi alguém usar somevalue>-1no lugar de somevalue IS NOT NULL(aparentemente há uma circunstância em que isso é mais eficiente, embora ele nunca tenha explicado para minha satisfação qual poderia ser a circunstância!). Pode haver isso e outras travessuras estranhas no código fora do banco de dados também.
    4. Mais importante: escala , escala particularmente inesperada. Software e dados que não morrem cedo geralmente sobrevivem à visão de seus criadores e crescem mais ao longo do tempo de acordo. A menos que você esteja muito limitado por armazenamento ou RAM (talvez em um sistema embutido), planeje pelo menos uma ordem de magnitude maior do que o esperado.
      Se eu espero que atingir ~ 400.000.000 seja provável no tempo de vida dos dados, muito antes da diferença entre 2 ou 4.000.000.000 ser considerada, já vou optar por uma chave maior, então dobrando usando valores negativos não vai fazer muita diferença.
      Você não quer fazer uma mudança em algo básico como um PK em quatro anos, mas menos ainda em oito anos. Em ambos os casos, se o design dura tanto tempo, você esqueceu os detalhes e muitos outros bits & bobs começaram a depender da chave, de modo que as mudanças que precisam ser feitas crescem massivamente, e mesmo essa única mesa será um trabalho enorme para change (a menos que a maioria dos dados seja excluída após um tempo), pois contém muitas linhas, então você tem todas aquelas que se referem a ele com FKs para trabalhar também.
    • 19
  2. Michael Green
    2021-01-30T03:45:00+08:002021-01-30T03:45:00+08:00

    Não, você não está perdendo nada. As identidades devem ser apenas substitutos internos sem sentido, que são para o computador alocar e lidar, e o computador não se importa se você usa números positivos ou negativos.

    No entanto .. nunca é tão simples. Sempre haverá um humano em algum lugar tentando ler essas coisas, compreendê-las e reconciliá-las. Apenas achamos mais difícil pensar em números negativos maciços do que em números positivos maciços. Não torne mais difícil para as pessoas que tentam fazer seu sistema funcionar. Eventualmente, eles vazarão - em relatórios, referências externas, telas. Tente dizer ao cliente menos dois bilhões que eles precisam usar um teclado de telefone para inserir seu ID de cliente para acessar sua conta!

    Se você acha que há alguma chance de transbordar a identidade em um futuro provável, use o tipo de dados maior imediatamente. As considerações que levaram aos problemas do Y2K são passadas. O disco é barato. A memória extra usada por consulta pode ser equilibrada com a tranquilidade de saber que o aplicativo foi projetado para uma vida útil de 50 anos. Você não precisará implementar monitoramento extra no dia 4 (ou 8!) anos a partir de agora, quando o último inteiro for alocado.

    Conheço um sistema que estourou e as identidades foram decrementadas em 2,1 bilhões, efetivamente reiniciando em int.Min. Eu vi outro uso de identidades negativas, mas falha porque o log as converte em varchar(10) truncando o sinal de menos. Conheço outro onde a identidade foi definida como numeric(18,0), só para ter certeza. E eu vi outro estouro sem um plano em vigor, derrubando o sistema por algum tempo. Porque quando você alcança int.max, você tem, por definição, quatro bilhões de linhas para lidar, e isso não é um fim de semana divertido.

    • 9

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve