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 / 1632
Accepted
kacalapy
kacalapy
Asked: 2011-03-09 12:17:23 +0800 CST2011-03-09 12:17:23 +0800 CST 2011-03-09 12:17:23 +0800 CST

Colunas de identidade ou UDF que geram explicitamente um ID exclusivo?

  • 772

Estou no meio de um debate sobre se é melhor fazer um PRIMARY KEYde um Identity Columns , ou de um UDF que gera explicitamente um id exclusivo.

  • Estou defendendo a Coluna de Identidade.
  • Meu sócio está defendendo a geração manual dos valores, ele alega
    • colocando o UDF em outra tabela onde podemos ter um UDF
      • bloquear o recurso
      • incrementar uma tabela de ID com um campo chamado ID_Valuepor1
      • use isso como um identificador exclusivo global
    • Ou faça com que a tabela faça um id+1ao inserir
    • Que é mais simples mover dados entre servidores e/ou ambientes sem a restrição de identificação; mover de um banco de dados onde há dados para outro banco de dados semelhante com, digamos, dados de teste ou fictícios. Para testes em não produção, podemos extrair todos os registros de ontem para a preparação para teste.

Qual implementação faz mais sentido?

sql-server sql-server-2005
  • 8 8 respostas
  • 3166 Views

8 respostas

  • Voted
  1. Best Answer
    gbn
    2011-03-09T12:20:36+08:002011-03-09T12:20:36+08:00

    Seu colega é um idiota.

    A solução não será escalável, o UDF não é concorrente ( mesmo motivo deste ). E como você lida com inserções de várias linhas: isso exigiria uma chamada UDF por linha

    E migrar para outro RDBMS não acontece com frequência na vida real ... você também pode não usar o SQL Server agora e usar sequências no Oracle e esperar não migrar.

    Editar:

    Sua atualização afirma que mover dados é para atualizar bancos de dados de não produção.

    Nesse caso, você ignora as colunas de identidade ao atualizar. Você não compromete sua implementação para facilitar o carregamento sem produção. Ou use tabelas temporárias para rastrear as alterações de valor de identidade.

    Ou use processos: atualizamos nosso sistema de teste todas as noites desde a produção, o que evita totalmente o problema. (E garante que nosso backup de prod também possa ser restaurado)

    • 21
  2. mrdenny
    2011-03-09T12:29:24+08:002011-03-09T12:29:24+08:00

    Use um valor de identidade. Gerar sua própria tabela de sequência e valores de sequência exigirá muita sobrecarga e causará muitos travamentos e bloqueios ao tentar gerar números.

    A identidade existe por uma razão, use-a.

    Quando o SQL Denali for lançado, ele oferecerá suporte a sequências que serão mais eficientes que a identidade, mas você não pode criar algo mais eficiente sozinho.

    Quanto à movimentação de registros de um ambiente para outro, ative IDENTITY_INSERT ON ao fazer a inserção ou marque a caixa no SSIS.

    • 11
  3. Mark Byers
    2011-03-09T12:20:40+08:002011-03-09T12:20:40+08:00

    A coluna de identidade parece boa para mim. Não tenho certeza se sigo a lógica sobre por que é difícil mover dados entre servidores.

    Se você deseja que cada linha tenha uma identidade globalmente exclusiva, pode usar um UUID, mas eu não faria isso, a menos que tenha certeza de que a exclusividade global é necessária - geralmente não é. O uso de UUIDs como IDs diminuirá o desempenho, aumentará os requisitos de espaço em disco e dificultará a depuração - devido ao tamanho, é difícil lembrar um UUID, contá-lo a alguém pelo telefone ou escrevê-lo no papel sem erros.

    • 5
  4. RacerX
    2011-03-09T12:19:45+08:002011-03-09T12:19:45+08:00

    Para IDs numéricos simples, basta ir com a identidade e esquecer todos os problemas de gerá-los manualmente.

    Você sempre pode criar uma "super tabela" que use uma identidade como PK e tenha uma coluna de tipo e qualquer outra informação. Quando você precisar de um novo ID (supondo que você quer dizer IDS exclusivo em tabelas diferentes), basta inserir nesta tabela e pegar SCOPE_IDENTITY()e inserir na tabela real que você precisa.

    Basicamente você cria uma tabela: MasterIDs com uma identidade PK, quando você precisa inserir uma linha em sua Table1, INSERT INTO MasterIDse obter a identidade gerada por essa linha usando SCOPE_IDENTITY()e inserir na Table1 usando esse valor como PK.

    Table1 terá uma PK int sem identidade. Você faria o mesmo processo para inserir na Table2, etc. Deixe o SQL Server gerenciar os valores de identidade na tabela MasterIDs , que você pode usar em suas outras tabelas. MasterIDs podem conter outras tabelas, como tipo (para que você possa saber qual tabela, Tabela1 ou Tabela2, etc., usa esse valor de identidade.

    • 4
  5. Joe Phillips
    2011-03-09T12:19:18+08:002011-03-09T12:19:18+08:00

    Contanto que você esteja usando restrições de chave estrangeira corretamente (cascata, atualização, etc.), você estará bem usando um campo de identidade. Eu realmente não vejo uma vantagem para a outra solução neste caso.

    • 3
  6. Silx
    2011-03-09T12:23:07+08:002011-03-09T12:23:07+08:00

    A identidade foi feita para se adequar ao seu cenário. Você tem ferramentas como replicação para troca de dados de servidores/ambientes que mantêm tudo junto.

    • 2
  7. Mark
    2015-09-30T01:37:29+08:002015-09-30T01:37:29+08:00

    Acabei de terminar um trabalho em que substituí uma identitycoluna do SQL Server por um intcampo normal e controlei a alocação de ID.

    Tenho visto ganhos de desempenho bastante impressionantes. Ao contrário do OP, não tenho UDF para gerar o id. Mas o princípio é praticamente o mesmo: existe uma parte do software que mantém um conjunto de id's. Quando eles acabam, ele recebe outro lote consultando o banco de dados para o próximo valor baixo e incrementa isso para o próximo alto .

    Isso nos permite gerar ids e relacionar todas as entidades fora de uma transação em nosso ORM antes de enviarmos os lotes ao banco de dados e também enviar lotes maiores sem ida e volta extras para obter a identidade recém-inserida (exigida pelas colunas de identidade).

    Na tabela de id que temos há mais de uma linha, o que nos permite usar intervalos específicos se desejarmos. ou seja, para reutilizar blocos excluídos e ids negativos.

    • 1
  8. Hrvoje Batrnek
    2019-02-18T01:32:09+08:002019-02-18T01:32:09+08:00

    Eu uso identidade há anos e considero seriamente substituir o número de identidade por UNIQUEIDENTIFIER. É um pesadelo quando você precisa alterar o tipo de dados se alguém o projetou para ser um banco de dados compacto e um pesadelo se você precisar adicionar identidade a uma coluna; além disso, você não pode atualizar a coluna de identidade. Imagine que você coloca um int e seu banco de dados cresce além de 2 bilhões de registros, novamente um pesadelo para mudar (considere os FKs)! Alterar qualquer coisa com identidade é um pesadelo e não é compatível com a escala, a menos que você coloque bigint! UNIQUEIDENTIFIER vs Identity = conveniência e robustez vs melhoria de desempenho talvez perceptível (não fiz o benchmark).

    Atualização: depois de ver isso , definitivamente me inclino para UNIQUEIDENTIER. Isso não mostra nenhum benefício real da identidade bigint e vários benefícios para o UNIQUEIDENTIFIER! Diferentes versões do SQL Server podem ter um resultado diferente. Existe beleza em ter um id único em todos os bancos de dados e sistemas (robustez)! Mova, copie, transforme dados como quiser! https://www.mssqltips.com/sqlservertip/5105/sql-server-performance-comparison-int-versus-guid/

    • 0

relate perguntas

  • 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

  • Downgrade do SQL Server 2008 para 2005

Sidebar

Stats

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

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

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

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

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 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
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +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
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +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