15 pontos por GN⁺ 2025-05-22 | 4 comentários | Compartilhar no WhatsApp
  • 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

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() e uuid_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 de gen_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

 
jaylee 2025-05-23

Em vez disso, estou usando Prisma + ULID. É bem mais curto e melhor.

 
ssssut 2025-05-22

Eu estava criando e usando funções como uuid_generate_v7(), então é uma notícia muito bem-vinda.

 
stomx 2025-05-22

Nossa!!

 
halfenif 2025-05-22

Nossa...!