quarta-feira, 16 de maio de 2007

Comando EXPLAIN

O comando EXPLAIN permite que se possa visualizar todas as etapas envolvidas no processamento de uma consulta.Esta visão do funcionamento interno do banco permite que se possa fazer melhorias em consultas que estejam tomando tempo excessivo, por exemplo.

Sintaxe:

EXPLAIN [ ANALYZE ] [ VERBOSE ] statement

O resultado do comando explain pode ser surpreendente. Consultas com várias linhas podem ser mais econômicas que uma operação descrita em uma linha de SQL, realizando a mesma tarefa.

A cláusula ANALYSE executa de fato o comando e retorna o tempo de execução. Pode tornar bem mais lento o resultado se a execução do comando for demorada. O uso de VERBOSE vai detalhar ainda mais o resultado do comando EXPLAIN, o que pode dificultar a leitura.



Abaixo, alguns exemplos comentados:

1- EXPLAIN em consulta sobre uma tabela simples.

explain select * from continente;

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

2- EXPLAIN ANALYZE em consulta sobre uma tabela simples.

explain analize select * from continente;

Seq Scan on continente (cost=0.00..1.03 rows=3 width=646) (actual time=0.016..0.020 rows=3 loops=1)
Total runtime: 0.085 ms

3 - EXPLAIN ANALYZE VERBOSE em consulta sobre uma tabela simples. O Resultado é bastante detalhado.

explain analize select * from continente;

{SEQSCAN
:startup_cost 0.00
:total_cost 1.03
:plan_rows 3
:plan_width 646
:targetlist (
{TARGETENTRY
:expr
{VAR
:varno 1
:varattno 1
:vartype 1043
:vartypmod 54
:varlevelsup 0
:varnoold 1
:varoattno 1
}
:resno 1
:resname nome
:ressortgroupref 0
:resorigtbl 16734
:resorigcol 1
:resjunk false
}
{TARGETENTRY
:expr
{VAR
:varno 1
:varattno 2
:vartype 1043
:vartypmod 254
:varlevelsup 0
:varnoold 1
:varoattno 2
}
:resno 2
:resname obs
:ressortgroupref 0
:resorigtbl 16734
:resorigcol 2
:resjunk false
}
{TARGETENTRY
:expr
{VAR
:varno 1
:varattno 3
:vartype 700
:vartypmod -1
:varlevelsup 0
:varnoold 1
:varoattno 3
}
:resno 3
:resname population
:ressortgroupref 0
:resorigtbl 16734
:resorigcol 3
:resjunk false
}
{TARGETENTRY
:expr
{VAR
:varno 1
:varattno 4
:vartype 23
:vartypmod -1
:varlevelsup 0
:varnoold 1
:varoattno 4
}
:resno 4
:resname cod
:ressortgroupref 0
:resorigtbl 16734
:resorigcol 4
:resjunk false
}
{TARGETENTRY
:expr
{VAR
:varno 1
:varattno 5
:vartype 700
:vartypmod -1
:varlevelsup 0
:varnoold 1
:varoattno 5
}
:resno 5
:resname tamanho
:ressortgroupref 0
:resorigtbl 16734
:resorigcol 5
:resjunk false
}
)
:qual <>
:lefttree <>
:righttree <>
:initPlan <>
:extParam (b)
:allParam (b)
:nParamExec 0
:scanrelid 1
}

Seq Scan on continente (cost=0.00..1.03 rows=3 width=646) (actual time=0.012..0.017 rows=3 loops=1)
Total runtime: 0.084 ms

3 - EXPLAIN em consulta sobre uma tabela que é herdada por outras tabelas. Apresenta subconsultas às tabelas filhas.

explain select * from lugar;

Result (cost=0.00..13.26 rows=126 width=638)
-> Append (cost=0.00..13.26 rows=126 width=638)
-> Seq Scan on lugar (cost=0.00..11.20 rows=120 width=638)
-> Seq Scan on continente lugar (cost=0.00..1.03 rows=3 width=638)
-> Seq Scan on pais_cont lugar (cost=0.00..1.03 rows=3 width=638)

4 - EXPLAIN em consulta sobre uma visão com metadados das tabelas. .

explain select * from pg_tables;

Hash Left Join (cost=2.16..18.09 rows=72 width=200)
Hash Cond: (c.relnamespace = n.oid)
-> Hash Left Join (cost=1.04..15.62 rows=72 width=140)
Hash Cond: (c.reltablespace = t.oid)
-> Seq Scan on pg_class c (cost=0.00..13.59 rows=72 width=80)
Filter: (relkind = 'r'::char)
-> Hash (cost=1.02..1.02 rows=2 width=68)
-> Seq Scan on pg_tablespace t (cost=0.00..1.02 rows=2 width=68)
-> Hash (cost=1.05..1.05 rows=5 width=68)
-> Seq Scan on pg_namespace n (cost=0.00..1.05 rows=5 width=68)

Obs.: Não existe comando EXPLAIN na especificação oficial do SQL.

Nenhum comentário: