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 / 31137
Accepted
Barguast
Barguast
Asked: 2012-12-28 15:56:08 +0800 CST2012-12-28 15:56:08 +0800 CST 2012-12-28 15:56:08 +0800 CST

GUID sequencial ou bigint para tabela de banco de dados 'enorme' PK

  • 772

Sei que esse tipo de pergunta surge muito, mas ainda não li nenhum argumento convincente para me ajudar a tomar essa decisão. Por favor, tenha paciência comigo!

Eu tenho um banco de dados enorme - ele cresce cerca de 10.000.000 de registros por dia. Os dados são relacionais e, por motivos de desempenho, carrego a tabela com BULK COPY. Por esse motivo, preciso gerar chaves para as linhas e não posso contar com uma coluna IDENTITY.

Um inteiro de 64 bits - um bigint - é grande o suficiente para eu usar, mas para garantir a exclusividade, preciso de um gerador centralizado para criar meus IDs para mim. Atualmente, tenho um serviço de gerador que permite que um serviço reserve X números de sequência e garanta a ausência de colisões. No entanto, uma consequência disso é que todos os serviços que tenho dependem desse gerador centralizado e, portanto, estou limitado em como posso distribuir meu sistema e não estou satisfeito com as outras dependências (como exigir acesso à rede) impostas por este projeto. Isso tem sido um problema na ocasião.

Agora estou pensando em usar GUIDs sequenciais como minhas chaves primárias (geradas externamente para SQL). Pelo que pude verificar em meus próprios testes, a única desvantagem disso é a sobrecarga de espaço em disco de um tipo de dados mais amplo (que é exacerbado por seu uso em índices). Não testemunhei nenhuma desaceleração perceptível no desempenho da consulta, em comparação com a alternativa bigint. Carregar a tabela com BULK COPY é um pouco mais lento, mas não muito. Meus índices baseados em GUID não estão se tornando fragmentados graças à minha implementação de GUID sequencial.

Basicamente, o que eu quero saber é se há alguma outra consideração que eu possa ter esquecido. No momento, estou inclinado a dar o salto e começar a usar GUIDs. Eu não sou um especialista em banco de dados, então eu realmente aprecio qualquer orientação.

sql-server primary-key
  • 5 5 respostas
  • 6244 Views

5 respostas

  • Voted
  1. Best Answer
    usr
    2012-12-29T08:20:47+08:002012-12-29T08:20:47+08:00

    Estou em uma mesma situação semelhante. Atualmente, estou usando a abordagem GUID sequencial e não tenho fragmentação e geração de chave fácil.

    Percebi duas desvantagens que me levaram a começar a migrar para o bigint:

    1. Uso do espaço . 8 bytes a mais por índice. Multiplique isso por 10 índices ou mais e você terá um enorme desperdício de espaço.
    2. Os índices Columnstore não oferecem suporte a GUIDs.

    (2) Foi o assassino para mim.

    Agora vou gerar minhas chaves assim:

    yyMMddHH1234567890
    

    Estarei usando uma data inicial mais hora e tendo uma parte sequencial depois disso. Isso me permite consultar meus dados por intervalo sem nenhum índice de adição. Este é um bom bônus para mim.

    Vou gerar a parte sequencial do bigint usando um algoritmo HiLo que se presta bem a ser distribuído .

    Espero que algumas dessas transferências para a sua situação. Eu definitivamente recomendo usar bigint.

    • 4
  2. marc_s
    2012-12-28T23:43:36+08:002012-12-28T23:43:36+08:00

    Com um tipo INT, começando em 1, você obtém mais de 2 bilhões de linhas possíveis - isso deve ser mais do que suficiente para a grande maioria dos casos. Com BIGINT, você obtém aproximadamente 922 quatrilhões (922 com 15 zeros - 922.000 bilhões) - o suficiente para você?

    Se você usar um INT IDENTITYinício em 1 e inserir uma linha a cada segundo, precisará de 66,5 anos antes de atingir o limite de 2 bilhões....

    Se você usar um BIGINT IDENTITYinício em 1 e inserir mil linhas a cada segundo, precisará de impressionantes 292 milhões de anos antes de atingir o limite de 922 quatrilhões....

    Usando seus 10 milhões de linhas por dia, você terá números suficientes para aproximadamente 1'844'674'407'370 dias ( 1844 bilhões de dias ou um tique acima de 5 bilhões de anos ) de dados - isso é bom o suficiente para suas necessidades ?

    Leia mais sobre isso (com todas as opções disponíveis) nos MSDN Books Online .

    • 3
  3. Atheer Mostafa
    2012-12-29T06:05:56+08:002012-12-29T06:05:56+08:00

    Eu recomendo que você use SEQUENCE do tipo de dados BIGINT no SQL 2012 Isso é muito mais flexível do que IDENTITY com opções como cache/nocache, você também pode atribuir um intervalo de sequência para sua operação em lote como sp_sequence_get_range.

    • 2
  4. Cade Roux
    2012-12-29T11:50:47+08:002012-12-29T11:50:47+08:00

    A razão pela qual você não pode usar IDENTITY é porque já existem relacionamentos de chave estrangeira entre tabelas separadas que você está carregando? E não há outra chave natural para você conseguir conectá-los em uma operação de uma área de preparação para a área de produção? Por esse motivo, gostaria de saber um pouco mais sobre como eles estão "vinculados" no sistema de origem antes de você copiar em massa? Os sistemas de origem múltipla simplesmente usam suas próprias sequências e têm a possibilidade de sequências conflitantes quando colocadas em um banco de dados compartilhado?

    A técnica COMB ID/GUID sequencial é aquela com a qual estou familiarizado e é viável sempre que você precisar efetivamente dessa exclusividade global atribuída fora do banco de dados - é efetivamente uma identidade de linha utilizável dentro e fora do banco de dados. Por esse motivo, em ambientes altamente distribuídos ou cenários desconectados, é uma boa escolha

    Exceto se você realmente não precisar, porque essa diferença de largura extra é significativa quando o tamanho dos dados aumenta e essas chaves estão em todos os índices e os conjuntos de trabalho para muitas consultas.

    Além disso, com a geração distribuída, se as linhas não vierem realmente na ordem da coluna GUID, os problemas com o uso disso para a chave de índice clusterizado (estreito, estático, crescente) podem causar alguma fragmentação em comparação com o clustering em uma IDENTITY ainda permanecer.

    • 2
  5. Serg
    2012-12-30T07:56:53+08:002012-12-30T07:56:53+08:00

    Em geral é possível usar a OUTPUTcláusula de INSERTcomando para que os dados sejam inseridos em ambas as tabelas e relacionados com o campo de identidade.

    O identificador baseado no registro de data e hora não deve ser considerado confiável - depende do relógio do sistema, que por sua vez depende de muitas coisas - do relógio do hardware aos serviços de sincronização de tempo.

    • 0

relate perguntas

  • Chaves primárias de caractere x número inteiro

  • 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

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 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

    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

    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
    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
    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
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +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