EXPLAIN [ ANALYZE ] [ VERBOSE ] consulta
Este comando mostra o plano de execução que o planejador do PostgreSQL gera para a consulta fornecida. O plano de execução mostra como a(s) tabela(s) referenciada pela consulta será varrida --- por uma varredura seqüencial, varredura do índice, etc. --- e, se várias tabelas forem referenciadas, quais algoritmos de junção serão usados para unir as tuplas requisitadas de cada tabela de entrada.
A parte mais crítica mostrada é o custo estimado da execução da consulta, que é a estimativa feita pelo planejador sobre a duração da execução da consulta (medida em unidade de acesso às páginas do disco). Na verdade dois números são mostrados: o tempo inicial anterior à primeira tupla poder ser retornada, e o tempo total para retornar todas as tuplas. Para a maioria das consultas o tempo total é o que interessa, mas em contextos como os das subconsultas EXISTS o planejador escolhe o menor tempo inicial em vez do menor tempo total (porque o executor pára após ter obtido uma linha). Além disso, se for limitado o número de tuplas a serem retornadas usando a cláusula LIMIT, o planejador efetua uma interpolação apropriada com relação aos custos finais para saber qual plano é realmente o de menor custo.
A opção ANALYZE faz com que a consulta seja realmente executada, e não apenas planejada. O tempo total de duração gasto dentro de cada parte do plano (em milissegundos) e o número total de linhas realmente retornadas são adicionados ao que é normalmente mostrado. Esta opção é útil para ver se as estimativas do planejador estão próximas da realidade.
A opção VERBOSE fornece a representação interna completa da árvore do plano, em vez de apenas o seu sumário (e a envia para o arquivo de log do postmaster, também). Geralmente esta opção é útil apenas para fazer o debug do próprio PostgreSQL.
Caution |
Tenha em mente que a consulta é realmente executada quando a opção ANALYZE é usada. Embora o EXPLAIN despreze qualquer saída que o SELECT possa retornar, outros efeitos colaterais da consulta acontecem na forma usual. Para usar EXPLAIN ANALYZE em um INSERT, UPDATE, ou DELETE sem deixar que os dados sejam afetados, utilize o seguinte procedimento: BEGIN; EXPLAIN ANALYZE ...; ROLLBACK; |
Para mostrar o plano da consulta para uma consulta simples em uma tabela com uma única coluna int4 e 128 linhas:
EXPLAIN SELECT * FROM foo; NOTICE: QUERY PLAN: Seq Scan on foo (cost=0.00..2.28 rows=128 width=4) EXPLAIN
Para a mesma tabela contendo um índice para dar suporte a uma condição de eqüijunção na consulta, o comando EXPLAIN mostra um plano diferente:
EXPLAIN SELECT * FROM foo WHERE i = 4; NOTICE: QUERY PLAN: Index Scan using fi on foo (cost=0.00..0.42 rows=1 width=4) EXPLAIN
E finalmente, para a mesma tabela contendo um índice para dar suporte a uma condição de eqüijunção na consulta, o comando EXPLAIN mostra o seguinte para uma consulta contendo uma função de agregação:
EXPLAIN SELECT sum(i) FROM foo WHERE i = 4; NOTICE: QUERY PLAN: Aggregate (cost=0.42..0.42 rows=1 width=4) -> Index Scan using fi on foo (cost=0.00..0.42 rows=1 width=4)
Observe que os números específicos mostrados, e mesmo a estratégia selecionada para a consulta, pode variar entre versões do PostgreSQL devido a melhorias no planejador.