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 navegadorCole 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.
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.
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.
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.