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 / 102448
Accepted
sudo
sudo
Asked: 2015-05-26 15:34:59 +0800 CST2015-05-26 15:34:59 +0800 CST 2015-05-26 15:34:59 +0800 CST

Como devo indexar um UUID no Postgres?

  • 772

Sou novo no PostgreSQL e um pouco novo em bancos de dados em geral. Existe uma maneira estabelecida de como devemos indexar valores UUID no Postgres? Estou dividido entre usar hash e usar um trie, a menos que já haja algo embutido que ele use automaticamente. O que quer que eu use vai lidar com grandes quantidades de dados.

A família de operadores SP-GiST "text_ops" indexa usando um trie. Como os UUIDs são bastante longos e muito diferentes, eles parecem atraentes, embora eu só faça pesquisas de correspondência completa.

Há também uma opção de hash. Hashing é O(1), e não precisarei fazer nenhuma comparação além da igualdade, é claro, mas como os UUIDs são bastante longos, temo que gerar hashes a partir deles desperdiçaria muito tempo.

Ou isso é algo que depende muito das especificidades do sistema e do uso?

Eu prefiro usar bigserial na maioria dos casos, mas me disseram para usar uuid para isso. Precisamos de uuid porque podemos ter vários servidores usando bancos de dados diferentes, portanto, não há garantia de que teremos bigints exclusivos. Poderíamos usar uma sequência (e semente) diferente para cada servidor, mas ainda não é tão flexível quanto os UUIDs. Por exemplo, não poderíamos migrar entradas de banco de dados de um servidor para outro sem converter os IDs e suas referências em todos os lugares.

postgresql index
  • 4 4 respostas
  • 41409 Views

4 respostas

  • Voted
  1. Best Answer
    Craig Ringer
    2015-05-26T16:55:43+08:002015-05-26T16:55:43+08:00

    uuidUse o tipo de dados interno do PostgreSQL e crie um índice regular de b-tree nele.

    Não há necessidade de fazer nada de especial. Isso resultará em um índice ideal e também armazenará o uuidcampo em um formato tão compacto quanto possível atualmente.

    (Os índices de hash no PostgreSQL anteriores à versão 10 não eram seguros contra falhas e eram realmente uma relíquia histórica que tendia a não ter um desempenho melhor do que uma árvore b. Evite-os. No PostgreSQL 10 eles foram feitos à prova de falhas e tinham alguns melhorias de desempenho feitas para que você possa considerá-las.)

    Se por algum motivo você não puder usar o uuidtipo, você geralmente criaria uma b-tree na representação de texto ou, de preferência, uma bytearepresentação do uuid.

    • 57
  2. Najib
    2020-04-13T15:50:02+08:002020-04-13T15:50:02+08:00

    Índice BRIN? Se você usar UUIDs baseados em tempo (versão 1), eles serão gerados para que seu valor aumente. Nesse caso, o BRIN é adequado.

    https://www.postgresql.org/docs/9.5/brin-intro.html :

    BRIN significa Block Range Index. O BRIN foi projetado para lidar com tabelas muito grandes nas quais certas colunas têm alguma correlação natural com sua localização física na tabela. Um intervalo de blocos é um grupo de páginas fisicamente adjacentes na tabela; para cada intervalo de blocos, algumas informações resumidas são armazenadas pelo índice. Por exemplo, uma tabela que armazena os pedidos de venda de uma loja pode ter uma coluna de data na qual cada pedido foi feito e, na maioria das vezes, as entradas dos pedidos anteriores também aparecerão mais cedo na tabela; uma tabela que armazena uma coluna de CEP pode ter todos os códigos de uma cidade agrupados naturalmente.

    Os índices BRIN podem satisfazer consultas por meio de varreduras regulares de índice de bitmap e retornarão todas as tuplas em todas as páginas dentro de cada intervalo se as informações de resumo armazenadas pelo índice forem consistentes com as condições da consulta. O executor da consulta é responsável por verificar novamente essas tuplas e descartar aquelas que não correspondem às condições da consulta – em outras palavras, esses índices são com perdas. Como um índice BRIN é muito pequeno, a varredura do índice adiciona pouca sobrecarga em comparação com uma varredura sequencial, mas pode evitar a varredura de grandes partes da tabela que são conhecidas por não conter tuplas correspondentes.

    Os dados específicos que um índice BRIN armazenará, bem como as consultas específicas que o índice poderá atender, dependem da classe de operador selecionada para cada coluna do índice. Tipos de dados com uma ordem de classificação linear podem ter classes de operadores que armazenam o valor mínimo e máximo dentro de cada intervalo de bloco, por exemplo; tipos geométricos podem armazenar a caixa delimitadora para todos os objetos no intervalo de blocos.

    O tamanho do intervalo de blocos é determinado no momento da criação do índice pelo parâmetro de armazenamento pages_per_range. O número de entradas de índice será igual ao tamanho da relação em páginas dividido pelo valor selecionado para pages_per_range. Portanto, quanto menor o número, maior o índice se torna (devido à necessidade de armazenar mais entradas de índice), mas ao mesmo tempo os dados de resumo armazenados podem ser mais precisos e mais blocos de dados podem ser ignorados durante uma varredura de índice.

    Perfeito para dados enormes e "principalmente" ordenados.

    Veja este post para alguns benchmarks:

    https://www.percona.com/blog/2019/07/16/brin-index-for-postgresql-dont-forget-the-benefits/

    Eles geraram uma tabela de 1,3 GB de dados naturalmente ordenados (timestamps cimentados). Em seguida, eles geraram um índice BRIN (com pages_per_range = 32) e um índice B-Tree neste banco de dados. Em seguida, eles compararam o tempo de execução do SELECT e o tamanho dos índices. O que eles conseguiram:

    B-Árvore:

    Tempo de planejamento: 22,225 ms Tempo de execução: 2,657 ms

    público | testtab_date_idx | índice | postgres | testtab | 171 MB

    BRIN:

    Tempo de planejamento: 0,272 ms Tempo de execução: 87,703 ms

    público | testtab_date_brin_idx | índice | postgres | testtab | 64 KB

    enquanto isso, sem índice, seria:

    Tempo de planejamento: 0,296 ms Tempo de execução: 1766,454 ms

    Só para dar uma noção das ordens.

    O que é importante discutir ainda é a complexidade da atualização do índice após o INSERT dos dois. Enquanto para BRIN é O(1), uma vez que você escreve sequencialmente no próximo espaço livre na memória e, consequentemente, cria novas entradas BRIN, no entanto, para B-Tree, como bem sabemos, é O(logN) ( B-Trees ) ( mais alto a árvore leva mais tempo).

    • 10
  3. derekm
    2016-04-10T20:02:11+08:002016-04-10T20:02:11+08:00

    Índices de hash estão ausentes em ação no PostgreSQL. O PostgreSQL sabe que precisa de índices de hash e que seu código para índices de hash é antigo e mofado, mas eles não o removem porque estão esperando que alguém apareça e revise a indexação de hash. Veja este tópico:

    http://www.postgresql.org/message-id/[email protected]

    • 3
  4. Bohemian
    2022-07-14T20:51:47+08:002022-07-14T20:51:47+08:00

    Use o tipo de índice padrão (ou seja, B-Tree).

    Embora não haja muito nele, hashnão foi mais rápido. hashtambém não suporta unique(se você precisar disso).

    Resultados obtidos dados:

    • Um tipo de coluna uuidmais cerca de 150 bytes de outras colunas
    • 10 milhões de linhas
    • criando cada tipo de índice e executandoanalyze mytable
    • executando umselect * from mytable where myuuid = '<some uuid>'::uuid
    • valor de tempo médio (incluindo sobrecarga da ferramenta, todos os resultados estavam dentro de uma faixa estreita)
    Tipo de índice Milissegundos
    Sem índice 3600
    btree (padrão) 90
    árvore única 100
    cerquilha 100
    hash único não suportado
    • 1

relate perguntas

  • Quanto "Padding" coloco em meus índices?

  • Sequências Biológicas do UniProt no PostgreSQL

  • O que significa "índice" em RDBMSs? [fechado]

  • Como criar um índice condicional no MySQL?

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

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