Voltar
PostgreSQL: Chaves UUIDv7 Carregam como bigint, UUIDv4 Demora o Dobro do Tempo

UUIDv7 se Destaca em Performance Contra UUIDv4 e Bigint no PostgreSQL

Aprofundamento CEVIU

Aprofundamento

A escolha da chave primária impacta profundamente a performance de um banco de dados, e o benchmark no PostgreSQL 18 demonstrou isso com clareza. Enquanto o bigint continua sendo a opção mais rápida e compacta para chaves sequenciais, o UUIDv7 emerge como uma alternativa robusta e performática para cenários que exigem identificadores universais. A principal diferença reside na forma como os índices B-tree são gerenciados. O UUIDv4, com sua aleatoriedade, força o PostgreSQL a espalhar as novas entradas por todo o índice, resultando em fragmentação. Isso leva a um baixo fator de preenchimento (fillfactor) das páginas do índice, aumento do tamanho do índice em disco e, crucialmente, mais operações de I/O, pois o banco precisa ler mais páginas para encontrar os dados.

Já o UUIDv7, sendo temporalmente ordenado, direciona as novas entradas para a extremidade direita do índice, minimizando a fragmentação e otimizando a escrita. Essa localidade de dados não só acelera as inserções, mas também reduz drasticamente o volume do Write-Ahead Log (WAL), já que menos páginas de índice precisam ser registradas integralmente após um checkpoint (o fenômeno das full_page_writes). Para leitura de dados recentes, o UUIDv7 também se sobressai, pois os registros mais novos tendem a estar próximos uns dos outros no disco e na memória cache (buffer pool), otimizando a eficiência do cache e diminuindo a latência de acesso.

O que mudou

A grande novidade é a inclusão nativa da função uuidv7() no PostgreSQL 18, marcando uma evolução importante para desenvolvedores que precisam de UUIDs com alta performance. Antes, a geração de UUIDs ordenados temporalmente frequentemente dependia de implementações no lado da aplicação ou de extensões externas. Agora, o banco de dados oferece uma solução otimizada diretamente no core. Além disso, o PostgreSQL 18 padronizou uuidv4() como um alias explícito para o que gen_random_uuid() já produzia, clarificando as opções disponíveis para identificadores aleatórios e ordenados.

Por que isso importa

Para desenvolvedores, a performance do UUIDv7 significa menor latência em operações de escrita intensivas e maior eficiência no uso de recursos do banco de dados, como disco e memória. A redução no volume do WAL é um benefício significativo para a infraestrutura, impactando positivamente a replicação, backups e recuperação de desastres. Sistemas distribuídos, onde identificadores globais são essenciais e a fusão de dados é comum, se beneficiam enormemente da ordenação temporal do UUIDv7, que também facilita a depuração e auditoria ao correlacionar identificadores com o tempo de criação.

A capacidade de migrar facilmente tabelas existentes de UUIDv4 para o novo padrão, simplesmente alterando o DEFAULT da coluna, representa um caminho de otimização de baixo custo e alto impacto. Mesmo sem reconstruir o índice, novas inserções já se beneficiarão da melhoria. Em suma, o UUIDv7 oferece um balanço atraente entre a universalidade dos UUIDs e a performance que se aproxima das chaves sequenciais, tornando-o a escolha padrão para a maioria dos novos projetos e uma otimização valiosa para os existentes.

Linha do tempo

  1. CEVIU News publica sobre Postgres 19 e migração para compressão LZ4

  2. CEVIU News reporta estudo comparando DuckDB e Apache Spark para processamento de JSON no S3

  3. CEVIU News cobre otimização de expressões regulares no PostgreSQL com pg_tre e pg_re2

  4. CEVIU News divulga otimização de consultas Postgres pela Lorikeet com typecast

  5. CEVIU News aborda a eficiência do batching para performance de dados no PostgreSQL

  6. CEVIU News detalha nova extensão TIN para busca full-text de alta performance no PostgreSQL

  7. UUIDv7 se destaca em performance contra UUIDv4 e Bigint no PostgreSQL

Perguntas frequentes

Por que UUIDv7 é mais rápido que UUIDv4 no PostgreSQL?

UUIDv7 é temporalmente ordenado, o que otimiza a escrita no índice B-tree, reduzindo a fragmentação e garantindo que novas entradas sejam adicionadas na extremidade. Isso resulta em menos I/O, menor volume de WAL e melhor aproveitamento do cache, ao contrário do UUIDv4 que, por ser aleatório, espalha as escritas e fragmenta o índice.

Posso migrar uma tabela existente de UUIDv4 para UUIDv7 sem reescrever dados?

Sim, é possível alterar o comportamento de novas inserções. Basta usar ALTER TABLE sua_tabela ALTER COLUMN id SET DEFAULT uuidv7();. As novas chaves serão geradas com UUIDv7, compartilhando o mesmo tipo de coluna e índice com as chaves UUIDv4 existentes, trazendo benefícios de performance imediatamente para as novas inserções.

Quais as principais desvantagens de usar UUIDv7?

A principal desvantagem é que o timestamp embutido no UUIDv7 é legível, o que pode não ser desejável em cenários onde o tempo de criação de um identificador deve ser mantido em segredo. Além disso, UUIDs (incluindo v7) ocupam 16 bytes, o dobro dos 8 bytes de um bigint, impactando o tamanho do índice e das chaves estrangeiras.

UUIDv7 substitui completamente o bigint como chave primária?

Não completamente. O bigint ainda é a opção mais compacta e ligeiramente mais rápida. No entanto, o UUIDv7 é uma excelente alternativa para casos onde identificadores universais são necessários, como em sistemas distribuídos ou quando IDs são gerados por clientes, oferecendo uma performance significativamente superior ao UUIDv4 e muito próxima do bigint.

Fontes

Avalie este artigo:
Categoria
CEVIU Web Dev
Publicado
12 de outubro de 2026
Editoria
CEVIU Web Dev

Quer receber mais sobre CEVIU Web Dev?

Conteúdo curado diariamente, direto no seu e-mail.

Conteúdo curado diariamenteDiversas categoriasCancele quando quiser