Este comando mostra o plano de execução gerado pelo planejador do PostgreSQL para o comando fornecido. O plano de execução mostra como as tabelas referenciadas pelo comando serão varridas — por uma varredura seqüencial simples, varredura pelo índice, etc. — e, se forem referenciadas várias tabelas, quais algoritmos de junção serão utilizados para juntar as linhas requisitadas de cada uma das tabelas de entrada. [1] [2]
Do que é mostrado, a parte mais importante é o custo estimado de execução do comando, que é a estimativa feita pelo planejador de quanto tempo vai demorar para executar o comando (medido em unidades de acesso às páginas do disco). Na verdade, são mostrados dois números: o tempo inicial antes que a primeira linha possa ser retornada, e o tempo total para retornar todas as linhas. Para a maior parte dos comandos o tempo total é o que importa, mas em contextos como uma subseleção no EXISTS, o planejador escolhe o menor tempo inicial em vez do menor tempo total (porque o executor vai parar após ter obtido uma linha). Além disso, se for limitado o número de linhas retornadas usando a cláusula LIMIT, o planejador efetua uma interpolação apropriada entre estes custos para estimar qual é realmente o plano de menor custo.
A opção ANALYZE faz o comando ser realmente executado, e não apenas planejado. O tempo total decorrido gasto em cada nó do plano (em milissegundos) e o número total de linhas realmente retornadas são adicionados ao que é mostrado. Esta opção é útil para ver se as estimativas do planejador estão próximas da realidade.
Importante: Deve-se ter em mente que o comando é realmente executado quando se utiliza a opção ANALYZE. Embora o comando EXPLAIN não leve em conta qualquer saída produzida pelo SELECT, os outros efeitos colaterais do comando ocorrem da forma usual. Se for desejado utilizar EXPLAIN ANALYZE para um comando INSERT, UPDATE, DELETE ou EXECUTE sem deixar o comando afetar os dados, deve ser utilizado o seguinte procedimento:
BEGIN; EXPLAIN ANALYZE ...; ROLLBACK;
Executa o comando e mostra os tempos reais de execução.
Mostra a representação interna completa da árvore do plano, em vez de apenas um resumo. Geralmente esta opção é útil apenas para finalidades especiais de depuração. A saída produzida pela opção VERBOSE é formatada (pretty-print) ou não, dependendo de como estiver definido o parâmetro de configuração explain_pretty_print.
Qualquer comando SELECT, INSERT, UPDATE, DELETE, EXECUTE ou DECLARE, cujo plano de execução se deseja ver.
Existe apenas documentação esparsa sobre o uso do custo informado pelo otimizador no PostgreSQL. Para obter mais informações deve ser consultada a Seção 13.1.
Para que o planejador de comandos do PostgreSQL tome decisões a partir de informações razoáveis ao otimizar os comandos, o comando ANALYZE deve ser executado para registrar as estatísticas sobre a distribuição dos dados dentro da tabela. Se isto não tiver sido feito (ou se a distribuição estatística dos dados da tabela mudou de forma significativa desde a última vez que o comando ANALYZE foi executado), os custos estimados terão pouca chance de estarem em conformidade com as verdadeiras propriedades do comando e, conseqüentemente, poderá ser escolhido um plano de comando inferior.
Antes do PostgreSQL 7.3, o plano era mostrado na forma de uma mensagem NOTICE. Agora aparece na forma do resultado de uma consulta (formatado como uma tabela de uma única coluna do tipo texto).
Mostrar o plano para uma consulta simples em uma tabela com uma única coluna integer e 10.000 linhas:
EXPLAIN SELECT * FROM foo; QUERY PLAN --------------------------------------------------------- Seq Scan on foo (cost=0.00..155.00 rows=10000 width=4) (1 linha)
Havendo um índice, e sendo feita uma consulta com uma condição WHERE indexável, o comando EXPLAIN pode mostrar um plano diferente:
EXPLAIN SELECT * FROM foo WHERE i = 4; QUERY PLAN -------------------------------------------------------------- Index Scan using fi on foo (cost=0.00..5.98 rows=1 width=4) Index Cond: (i = 4) (2 linhas)
O exemplo abaixo mostra o plano para uma consulta contendo uma função de agregação:
EXPLAIN SELECT sum(i) FROM foo WHERE i < 10; QUERY PLAN --------------------------------------------------------------------- Aggregate (cost=23.93..23.93 rows=1 width=4) -> Index Scan using fi on foo (cost=0.00..23.92 rows=6 width=4) Index Cond: (i < 10) (3 linhas)
Abaixo está um exemplo da utilização do comando EXPLAIN EXECUTE para mostrar o plano para um comando preparado:
PREPARE query(int, int) AS SELECT sum(bar) FROM test WHERE id > $1 AND id < $2 GROUP BY foo; EXPLAIN ANALYZE EXECUTE query(100, 200); QUERY PLAN ------------------------------------------------------------------------------------------------------------------------- HashAggregate (cost=39.53..39.53 rows=1 width=8) (actual time=0.661..0.672 rows=7 loops=1) -> Index Scan using test_pkey on test (cost=0.00..32.97 rows=1311 width=8) (actual time=0.050..0.395 rows=99 loops=1) Index Cond: ((id > $1) AND (id < $2)) Total runtime: 0.851 ms (4 linhas)
Obviamente, os números específicos mostrados aqui dependem do conteúdo real das tabelas envolvidas. Deve ser observado, também, que os números, e mesmo a estratégia selecionada para o comando, podem variar entre versões diferentes do PostgreSQL devido a melhorias no planejador. Além disso, o comando ANALYZE utiliza amostragem aleatória para estimar as estatísticas dos dados; portanto, é possível que as estimativas de custo mudem após a execução do comando ANALYZE, mesmo que a distribuição real dos dados da tabela não tenha mudado.
[1] |
Oracle — O comando EXPLAIN PLAN mostra o plano de execução escolhido pelo otimizador do Oracle para os comandos SELECT, UPDATE, INSERT e DELETE. O plano de execução do comando é a seqüência de operações que o Oracle realiza para executar o comando. A árvore de origem da linha é o núcleo do plano de execução. Mostra as seguintes informações: A ordem das tabelas referenciadas pelo comando; O método de acesso para cada tabela mencionada no comando; O método de junção para as tabelas afetadas pela operação de junção no comando; Operações de dados como filtro, classificação e agregação. Além da árvore de origem da linha, a tabela do plano contém informações sobre: Otimização, como o custo e cardinalidade de cada operação; Particionamento, como o conjunto de partições acessadas; Execução paralela, como o método de distribuição das entradas de junção. Os resultados do comando EXPLAIN PLAN permitem determinar se o otimizador seleciona um determinado plano de execução como, por exemplo, junções por laços aninhados. Também ajuda a compreender as decisões do otimizador, como porque o otimizador escolhe junção por laços aninhados em vez de junção por hash, e permite compreender o desempenho do comando. Oracle® Database Performance Tuning Guide 10g Release 1 (10.1) Part Number B10752-01 (N. do T.) |
[2] |
DB2 — Ferramentas para coleta e análise de informações de explicação — O DB2 provê recursos abrangentes de explicação que fornecem informações detalhadas sobre o plano de acesso escolhido pelo otimizador para um comando SQL ou XQuery. As tabelas que armazenam os dados de explicação estão acessíveis em todas as plataformas suportadas, e contêm informações tanto para os comandos SQL e XQuery estáticos quanto dinâmicos. Diversas ferramentas e métodos dão a flexibilidade necessária para capturar, mostrar e analisar as informações de explicação. As informações de otimização detalhadas, que permitem análise em profundidade do plano de acesso, são armazenadas nas tabelas de explicação em separado do próprio plano de acesso. DB2 Version 9 for Linux, UNIX, and Windows (N. do T.) |