Os Identificadores Únicos Universais (UUIDs) são amplamente utilizados como chaves primárias em sistemas distribuídos — eles eliminam a necessidade de um gerador central de IDs e permitem que registros sejam criados de forma independente em múltiplos nós. No entanto, as escolhas de implementação têm um impacto significativo no desempenho. Este artigo oferece um guia completo para trabalhar com UUIDs no Firebird, abordando estratégias de armazenamento, opções de geração de chaves e seus efeitos mensuráveis na eficiência de índices, throughput de inserção e desempenho de consultas.
Armazenamento: Binário vs. String
A primeira e mais importante decisão é como armazenar um UUID. O tipo recomendado é BINARY(16) — compacto e eficiente. Armazenar UUIDs como strings CHAR(36) consome mais do que o dobro do espaço por valor, e a penalidade se multiplica no nível do índice: em benchmarks com 1 milhão de linhas, um índice UUID em formato string exigiu a gravação de 2.356 páginas durante a criação, contra apenas 1.257 páginas para o equivalente binário. Índices em string também apresentam maior profundidade de árvore e pior fator de agrupamento, afetando diretamente o desempenho das consultas.
UUID Versão 4 vs. UUID Versão 7
A função nativa GEN_UUID() do Firebird gera UUID v4 — valores completamente aleatórios. UUIDs aleatórios causam fragmentação significativa na B-tree, pois novas chaves são inseridas em posições arbitrárias. O UUID v7 é ordenado por tempo, tornando-o monotonicamente crescente dentro de uma instância do servidor. Isso tem consequências práticas importantes, comprovadas por dados de benchmark:
BIGINT.A causa raiz é o fator de agrupamento: índices UUID v4 têm agrupamento próximo ao pior caso (razão ≈ 1,0), o que significa que todo acesso ordenado causa I/O aleatório. UUID v7 alcança uma razão de agrupamento de ~0,60, reduzindo significativamente as leituras de páginas em varreduras por intervalo e consultas ordenadas.
Benefícios Adicionais do UUID v7
Como o UUID v7 codifica um timestamp em milissegundos nos seus bits mais significativos, um índice decrescente em uma coluna UUID v7 pode retornar de forma significativa os registros inseridos mais recentemente — algo semanticamente impossível com UUID v4. O Firebird 6.0 suporta GEN_UUID(7) nativamente; no Firebird 5.0, o UUID v7 pode ser gerado no lado da aplicação ou via UDR externa.
Recomendações Principais
BINARY(16), nunca como CHAR(36).BIGINT sequenciais, com apenas ~20% de sobrecarga na inserção e sem necessidade de uma sequência centralizada.Leitura recomendada para desenvolvedores que projetam esquemas Firebird para ambientes distribuídos ou replicados.
Leia o artigo em PDF ou HTML em