quinta-feira, 17 de maio de 2007

O Comando Explain II

Como interpretar os resultados do comando EXPLAIN?

O exemplo abaixo é relativamente simples, mas no entanto é revelador.

explain select * from continente

Seq Scan on continente (cost=0.00..1.03 rows=3 width=646)

O resultado do comando apresenta quatro números para cada nó do plano de execução de uma consulta:

- Custo inicial - 0.00 - é o custo de execução da consulta até o inicio da saída dos resultados. No nosso exemplo, este custo é mínimo, pois a consulta ér relativamente simples. Em outros casos, pode ser que o maior custo de execução de consulta seja exatamente este custo inicial.

- Custo total - 1.03 - custo total estimado considerando que todas as linhas serão retornadas. O uso de LIMIT em consultas faz com que o custo total seja reduzido.

- Rows - estimativa de quantidade de registros retornados.

- Width - estimativa de quantidade de bytes retornados.

Um segundo exemplo torna ainda mais claro o funcionamento do comando.

explain select nome, obs from continente order by nome

Sort (cost=1.05..1.06 rows=3 width=634)
Sort Key: nome
-> Seq Scan on continente (cost=0.00..1.03 rows=3 width=634)

Uma pequena mudança na consulta anteriori fez com que fossem necessárias várias operações antes do retorno dos resultados. Cada operação tem individualizados os custos inicial, total, em termos de linhas e em termos de bytes.

São informações que podem ser bastante úteis na otimização de consultas através do comando EXPLAIN.

Abaixo, duas consultas bastante semelhantes e seus custos. A simples utilização dos campos na cláusula select ao invés do * já causou uma importante redução no custo de execução da consulta no que tange à estimativa da quantidade dos bytes retornados:

explain select * from continente order by nome
Sort (cost=1.05..1.06 rows=3 width=646)
Sort Key: nome
-> Seq Scan on continente (cost=0.00..1.03 rows=3 width=646)

explain select nome from continente order by nome
Sort (cost=1.05..1.06 rows=3 width=118)
Sort Key: nome
-> Seq Scan on continente (cost=0.00..1.03 rows=3 width=118)

Nenhum comentário: