Eu sou novo no PostgreSQL e um tanto novo nos 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á exista algo incorporado 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 uma trie. Como os UUIDs são bastante longos e muito diferentes, esses sons são atraentes, mesmo que eu apenas fizesse 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 muito longos, tenho medo de que gerar hashes a partir deles perca muito tempo.
Ou isso é algo que depende muito do sistema e usa detalhes?
Prefiro usar bigserial na maioria dos casos, mas me disseram para usar o 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.
fonte
Respostas:
Use o
uuid
tipo de dados interno do PostgreSQL e crie nele um índice de árvore b regular.Não há necessidade de fazer nada de especial. Isso resultará em um índice ideal e também armazenará o
uuid
campo no formato mais compacto possível atualmente.(Os índices de hash no PostgreSQL anteriores à versão 10 não eram à prova de falhas e eram realmente uma relíquia histórica que tendia a ter um desempenho melhor do que um b-tree de qualquer maneira. Evite-os. No PostgreSQL 10 eles foram feitos à prova de falhas e tinham melhorias de desempenho feitas para que você possa considerá-las.)
Se, por algum motivo, você não puder usar o
uuid
tipo, geralmente criará uma árvore b na representação do texto ou, de preferência, umabytea
representação do uuid.fonte
hash
índices versusb-tree
seja uma crença comum, acho que seria útil citar fontes para tal afirmação.hash
índices agora são protegidos contra falhas. Dito isto, oshash
índices só podem ser usados com=
, portanto, se você precisar de outros operadores,b-tree
ainda é preferível.hash
não foi muito mais rápido do queb-tree
, mesmo no Postgres 10. Mas como os índices de hash ocupam muito menos espaço em disco que o b-tree, pode ser mais rápido em uma configuração em que grandes índices se tornam um problema que sinto que não foi o meu caso. Bem, vou ficar de olho agora que posso usá-los com segurança na v10.Os índices de hash estão ausentes em ação no PostgreSQL. O PostgreSQL sabe que precisa de índices de hash e que o código para índices de hash é antigo e mofado, mas não o remove porque está esperando alguém aparecer e revisar a indexação de hash. Veja este tópico:
http://www.postgresql.org/message-id/[email protected]
fonte