Estou tentando usar pg_stat_statements para otimizar minhas consultas, mas encontrei um obstáculo inesperado.
SELECT total_plan_time + total_exec_time as total_time, query
FROM pg_stat_statements
ORDER BY total_time
DESC LIMIT 10;
resulta em
ERROR: invalid byte sequence for encoding "UTF8": 0x00
Eu olhei para isso e parece que o Postgres não gosta do caractere NULL \00 nos campos de texto.
A maioria dos conselhos existentes on-line sobre esse erro são para pessoas que veem erros ao inserir dados no Postgres. Nesse caso, a correção parece ser filtrar o caractere nulo antes da inserção.
Nesse caso, parece que os dados já estão IN postgres, mas torna a visualização impossível de consultar.
a \d+ pg_stat_statements
me diz que a visão pg_stat_statements é construída a partir da execução de uma função. Tentei me livrar do caractere usando traduzir e substituir, mas sem sorte.
Alguma idéia de como posso encontrar a consulta incorreta com o caractere NULL? Estou assumindo que a correção de longo prazo é rastrear a consulta com o caractere NULL, descobrir como está entrando.
O que tentei até agora:
Verifiquei que seus dados definitivamente ruins fazendo um arquivo
SELECT pg_stat_statements_reset();
. A consulta acima funciona imediatamente depois disso por um curto período de tempo.Eu fiz um
\ef pg_stat_statements
e parece que o primeiro argumento é um booleano chamado show text. Passar false me permite consultar a tabela, o que me permite fazer isso:
SELECT total_plan_time + total_exec_time as total_time, queryid
FROM pg_stat_statements(false)
ORDER BY total_time
DESC LIMIT 10;
infelizmente, o queryid não é muito útil, a menos que haja alguma maneira de recuperar o texto da consulta mapeada sem esse erro.
Sugestões de como proceder são bem-vindas! Estou no PostgreSQL 13.4