UUIDv7 chega ao PostgreSQL 18
(thenile.dev)- O PostgreSQL 18 passa a oferecer suporte nativo a UUIDv7, fornecendo identificadores únicos ordenáveis e amigáveis para índices
- O UUIDv7 mantém a unicidade e a segurança em ambientes distribuídos dos UUIDs existentes, ao mesmo tempo em que adota uma estrutura de ordenação baseada em tempo, favorável a índices btree
- Entre as desvantagens do UUID tradicional — impossibilidade de ordenação, fragmentação de índice e tamanho em memória — os dois primeiros problemas são resolvidos, viabilizando ordenação cronológica e inserções otimizadas
- No PostgreSQL 18, é possível gerar UUIDs com a função
uuidv7(), e também há recursos de extração de timestamp e entrada de tempo customizada - Com isso, desaparecem os principais motivos para hesitar em usar UUID como chave primária, tornando-o uma opção mais adequada para sistemas distribuídos e ambientes multi-tenant
PostgreSQL 18
- A versão beta do PostgreSQL 18 foi lançada, e os testes estão em andamento com lançamento oficial previsto para setembro
- Principais recursos:
- Async I/O: entrada/saída assíncrona baseada em
io_uring, com ganho de 2~3x em velocidade para sequence scan e vacuum - Skip scan em índices btree multicoluna, otimização de consultas
OR/IN - Preservação das estatísticas do planner entre upgrades
- Função UUIDv7
- Colunas geradas virtuais, login com OAuth, adição de informações de I/O/CPU/WAL ao EXPLAIN, entre outros
- Async I/O: entrada/saída assíncrona baseada em
Vantagens do UUID
- Possibilidade de gerar IDs únicos em ambientes distribuídos
- Maior segurança com identificadores públicos imprevisíveis
- Possibilidade de gerar IDs diretamente no cliente, minimizando a comunicação com o servidor
Desvantagens do UUID tradicional
- Não é ordenável
- Queda no desempenho de inserção devido à não localidade no índice
- Sobrecarga pelo tamanho de 128 bits
Como o UUIDv7 resolve isso
- Nova versão de UUID introduzida de acordo com a RFC 9562 (publicada em maio de 2024)
- Usa timestamp baseado em Unix Epoch nos primeiros 48 bits e combina valores aleatórios + contador no restante
- Permite ordenação cronológica e maior eficiência na inserção em índices
- UUIDv6 é voltado à compatibilidade retroativa, e UUIDv8 a experimentos/extensões de fornecedores
- UUIDv7 é o único novo padrão com relevância prática real
Uso do UUIDv7 no PostgreSQL 18
- A função
uuidv7()gera UUIDs com base no horário atual uuidv7(INTERVAL)permite aplicar o offset de tempo desejado- As funções
uuid_extract_version()euuid_extract_timestamp()permitem extrair a versão do UUID e o horário de geração - Exemplo:
CREATE TABLE test ( id uuid DEFAULT uuidv7() PRIMARY KEY, name text ); INSERT INTO test (name) VALUES ('foo'); INSERT INTO test (name) VALUES ('bar'); INSERT INTO test (id, name) VALUES (uuidv7(INTERVAL '-1 hour'), 'oldest'); SELECT uuid_extract_timestamp(id), name FROM test ORDER BY id; uuidv4()foi adicionado como alias degen_random_uuid()
Conclusão e recomendação
- O UUIDv7 é uma boa opção para quem enfrentava problemas de desempenho com UUID tradicional
- Ele mantém as vantagens do UUID enquanto entrega ordenabilidade e melhor desempenho de índice
- Já pode ser testado agora mesmo no beta do PostgreSQL 18
- É uma escolha adequada para geração de IDs em sistemas distribuídos, apps multi-tenant e ambientes serverless
“UUIDv7 é uma adição discreta, mas poderosa, que faz reconsiderar o uso de UUID como chave primária no Postgres”
4 comentários
Em vez disso, estou usando Prisma + ULID. É bem mais curto e melhor.
Eu estava criando e usando funções como
uuid_generate_v7(), então é uma notícia muito bem-vinda.Nossa!!
Nossa...!