Analisador EXPLAIN do PostgreSQL

Cole o plano JSON de EXPLAIN (ANALYZE, BUFFERS, FORMAT JSON) para ver a árvore e os pontos quentes que esta página detecta localmente. O plano é analisado no seu navegador: a consulta não é executada e nenhum banco é contatado.

Funciona localmente no seu navegador
Esta ferramenta processa todos os dados localmente no seu navegador.
JSON do EXPLAINCole o resultado JSON; o banco nunca é contatado.

Como ler um plano de execução do PostgreSQL a partir do JSON do EXPLAIN

Cole a saída JSON de EXPLAIN (ANALYZE, BUFFERS, FORMAT JSON) e clique em Analisar plano. A página desenha a árvore do plano, soma nós, custo, tempo real e linhas e lista os pontos quentes que consegue reconhecer localmente.

O plano é analisado no navegador; nenhuma instrução é executada e nada é enviado a um banco nem a este site. Só o formato JSON é lido — o formato de texto do psql não substitui.

  1. Rode a consulta com EXPLAIN (ANALYZE, BUFFERS, FORMAT JSON) — com ANALYZE, senão não há linhas nem tempos reais para comparar.
  2. Cole o resultado completo (o array externo serve) na caixa e clique em Analisar plano.
  3. Leia primeiro o resumo: número de nós, maior custo total, tempo de execução e linhas devolvidas na raiz.
  4. Confira a lista de achados: desvios de estimativa, linhas descartadas por um filtro, lados internos executados muitas vezes e o nó mais lento são os que merecem ação.
  5. Corrija uma coisa por vez (um índice, uma reescrita, a meta de estatísticas) e rode o plano de novo para ver se os números mudam.

O que o analisador informa, o que ele não vê e como usar o resultado

O que o analisador informa

O resumo mostra o número de nós, o maior Total Cost da árvore, o tempo de execução (Execution Time quando existe; senão o nó mais lento) e as linhas devolvidas pelo nó raiz. A árvore repete custo, tempo real, linhas, loops, a estimativa e a condição de índice ou filtro de cada nó.

A lista de achados compara Plan Rows com as linhas realmente devolvidas: quando diferem dez vezes ou mais, o nó aparece com os dois números. Também informa um filtro que descartou pelo menos dez vezes mais linhas do que devolveu, um lado interno executado mil vezes ou mais e o nó mais lento quando leva ao menos 50 ms e ao menos um quinto do tempo de execução.

O que ele não vê

Um plano sem ANALYZE não tem linhas nem tempos reais, então a página avisa e omite as métricas de tempo em vez de mostrar zeros; as checagens de estimativa são puladas pelo mesmo motivo. Os contadores de BUFFERS aparecem no JSON mas não são interpretados aqui, e JIT, divisão entre workers paralelos e tempo de triggers ou funções não são analisados.

Um plano é uma execução: cache quente, estatísticas diferentes, outro valor de parâmetro ou um prepared statement reutilizando um plano genérico podem gerar outra árvore. Compare planos obtidos nas mesmas condições e trate os achados como indícios a investigar, não como veredito.

Agir sobre o resultado

Um desvio grande de estimativa costuma indicar estatísticas desatualizadas ou um predicado que o planejador não consegue estimar (função sobre a coluna, condição correlacionada, distribuição incomum); ANALYZE, uma meta de estatísticas maior ou reescrever o predicado mudam o plano antes de qualquer índice.

Linhas descartadas por um filtro apontam para índice ausente ou não usado e para um predicado pouco seletivo, enquanto um lado interno repetido em nested loop é o sinal clássico de um join que um hash join resolveria melhor. Mude uma coisa, rode de novo com os mesmos parâmetros e fique com o plano que ganha na carga que você realmente usa.

Ferramentas recentes: