Para armazenar um UUID de 128 bits, existem várias opções de armazenamento:
- uma coluna de byte[16]
- duas colunas bigint/long(64 bits)
- uma coluna CHAR(36) - 32 dígitos hexadecimais + 4 traços.
- uma coluna específica do banco de dados UUID, se db suportar
Do ponto de vista da indexação, quais são os mais eficientes? Se o banco de dados não suportar um tipo uuid dedicado, qual de 1, 2, 3 são os melhores candidatos?
Um tipo dedicado
uuid
é sua melhor aposta para o PostgreSQL. Difícil dizer com outros bancos de dados - não é impossível para alguém implementar umuuid
tipo armazenado com menos eficiência do que um tipo de byte simples.Novamente no PostgreSQL,
bytea
seria uma maneira razoável de armazenar UUIDs se você não tivesse ouuid
tipo. Para outros bancos de dados, depende de como eles armazenam dados binários.Sempre que possível, eu evitaria fortemente usar hexadecimais com travessões. É muito menos eficiente comparar, classificar e armazenar.
Então, realmente, "não (2) ou (3)". Sempre. Use (4) onde suportado, (1) caso contrário.
Na ordem de preferência: 4,1,2,3 Não use UUIDs como a chave de clustering se estiver usando o SQL Server, além de fragmentar mal, a chave de clustering é usada em todos os índices não clusterizados e você adicionaria esses bytes a cada linha do índice. A fragmentação pode ser atenuada usando NEWSEQUENTIALID, mas geralmente prefira uma identidade binint para sua chave de cluster em vez de um GUID para evitar o inchaço em outros índices.
A diferença entre escolher 1 em vez de 2 dependerá de quão eficiente o banco de dados lida com duas colunas de tipos básicos em uma matriz fixa de coluna única. Deve ser fácil testar com dados fictícios. Observe a velocidade de suas consultas, bem como o tamanho de índices e dados. Pequeno+rápido é o melhor!
Seria preciso supor que qualquer tipo de dados com suporte nativo seria melhor otimizado no produto do que qualquer coisa que pudesse ser reunida como um cliente desse produto. Depois disso, o que tiver a menor contagem de bytes para obter o máximo de linhas por página.