Otimização de Consultas Postgres: Lorikeet Acelera Desempenho em até 1.000x com Simples Typecast
Aprofundamento CEVIU
Aprofundamento
A otimização de 1.000 vezes da Lorikeet no PostgreSQL girou em torno de uma sutileza entre os tipos de dados timestamp e timestamptz e sua interação com o Row Level Security (RLS). A função NOW() no Postgres retorna um timestamptz. Quando comparado a uma coluna createdAt do tipo timestamp, o banco precisava realizar uma comparação entre tipos de dados diferentes. Embora o Postgres tivesse um índice no (owner, createdAt), a parte createdAt não era usada eficientemente.
O problema é que o PostgreSQL classifica funções como "leakproof" (à prova de vazamento) ou "not leakproof" para garantir a segurança dos dados sob RLS. Historicamente, a conversão de timestamp para timestamptz podia causar um erro de underflow, vazando informações sobre os dados ocultos. Mesmo após a correção desse bug em 2020, a classificação de "not leakproof" da função de comparação permaneceu. Isso impediu o uso do índice, forçando um filtro lento. O simples typecast NOW()::timestamp alinhou os tipos de dados, tornando a comparação "leakproof" e permitindo que o índice fosse totalmente utilizado.
O que mudou
Este caso da Lorikeet expõe uma evolução interessante na compreensão dos mecanismos internos do PostgreSQL. Um bug histórico de conversão entre timestamp e timestamptz, que poderia vazar informações sob RLS, foi corrigido em 2020. No entanto, a classificação da função de comparação como "not leakproof" não foi atualizada. Além disso, a fonte da notícia menciona que, "apenas no mês passado" (julho de 2026), outro bug foi encontrado, onde essa comparação ainda poderia gerar resultados incorretos durante ajustes de horário de verão. Essa linha do tempo mostra que mesmo em sistemas maduros, detalhes técnicos podem ter efeitos cascata e exigem vigilância contínua.
Por que isso importa
A história da Lorikeet é um lembrete de que a performance em sistemas de dados não é só sobre hardware ou grandes algoritmos. Pequenos detalhes, como a gestão precisa de tipos de dados e o entendimento das particularidades de recursos como RLS, são cruciais. Uma diferença sutil de tipo pode transformar uma consulta rápida em um gargalo massivo. Para quem trabalha com engenharia de dados, analytics e arquitetura, essa é uma lição clara: otimizações significativas muitas vezes estão escondidas em interações inesperadas entre componentes do banco de dados, exigindo um mergulho profundo no comportamento do sistema.
Linha do tempo
Otimização de Pruning em Colunas Não-Particionadas Impulsiona Desempenho
Otimizando o LISTEN/NOTIFY do PostgreSQL para Alta Escalabilidade
DBOS Otimiza Escalabilidade do LISTEN/NOTIFY do PostgreSQL com Buffering e Batching
Physical Intelligence Otimiza Stack de Dados Robóticos com PostgreSQL e ClickHouse
Otimização de Performance SQL: Estratégias para Índices Eficientes que Reduzem Tempos de Resposta
Otimizando Expressões Regulares no PostgreSQL com Novas Extensões: pg_tre e pg_re2
Lorikeet Acelera Desempenho em até 1.000x com Simples Typecast
Perguntas frequentes
Qual a diferença entre 'timestamp' e 'timestamptz' no PostgreSQL?
timestamp armazena data e hora sem qualquer informação de fuso horário. Já timestamptz (timestamp with timezone) armazena a data e hora e a converte para o fuso horário UTC com base no fuso horário da sessão, embora não persista o fuso horário em si. Ambos ocupam 8 bytes de armazenamento.
O que é Row Level Security (RLS) e como ele influencia a performance?
RLS permite que o administrador do banco de dados defina políticas para controlar quais linhas de uma tabela são visíveis ou atualizáveis para diferentes usuários. Ele impacta a performance porque o PostgreSQL precisa verificar se as funções e operadores usados nos filtros são "leakproof" (à prova de vazamento). Se não forem, pode impedir o uso eficiente de índices para evitar vazamento de dados.
Por que a comparação entre 'timestamp' e 'timestamptz' não era considerada 'leakproof'?
Historicamente, a conversão de um timestamp próximo ao seu valor mínimo para timestamptz poderia causar um erro de underflow em certos fusos horários UTC. Este erro poderia, em tese, vazar informações sobre um valor oculto que estaria próximo dos limites do tipo de dado, levando à classificação de "not leakproof" para a função de comparação.
Como um simples 'typecast' conseguiu acelerar a consulta em 1.000 vezes?
O typecast NOW()::timestamp forçou a expressão NOW() (que retorna timestamptz) a ser tratada como um timestamp. Isso alinhou os tipos de dados na comparação, fazendo com que o PostgreSQL considerasse a operação como "leakproof" e, consequentemente, permitisse o uso completo do índice composto, resultando na drástica melhoria de desempenho.
Fontes
- linkedin.comfonte original
- Categoria
- CEVIU Dados
- Publicado
- 31 de agosto de 2026
- Editoria
- CEVIU Dados

