Utilice el comando EXPLAIN para mostrar un plan de ejecución de consultas o la distribución para una consulta. Un plan de ejecución especifica cómo se exploran la tabla o las tablas a las que la consulta hace referencia (por ejemplo, mediante una exploración secuencial sencilla).
EXPLAIN [VERBOSE] [DISTRIBUTION] [PLANTEXT|PLANGRAPH] <query>
| Entrada | Descripción |
|---|---|
| VERBOSE | Muestre la representación interna completa del árbol del plan, en lugar de solo un resumen, y envíe el plan al archivo de registro del postmaster. Esta opción es útil para la depuración. |
| <query> | La consulta para la que se va a mostrar el plan de ejecución. |
| DISTRIBUTION | Muestre el plan de distribución. Si utiliza el subcomando DISTRIBUTION, el comando EXPLAIN imprime la distribución que el planificador utiliza en la sentencia SELECT de un comando CTAS que no ha especificado DISTRIBUTE ON(). |
| PLANTEXT | Muestra el plan como texto. |
| PLANGRAPH | Muestra el plan como HTML. |
| Salida | Descripción |
|---|---|
| NOTICE: query plan: plan | Mensaje inicial correspondiente a un plan de consulta explícito. |
| NOTICE: result-set distribution | Mensaje inicial correspondiente a una consulta de distribución. |
| EXPLAIN | Mensaje que indica el final del plan de consulta explícito o de la consulta de distribución. |
Este comando no requiere privilegios especiales.
MYDB.SCH1(USER)=> EXPLAIN SELECT * FROM foo;
NOTICE: QUERY PLAN:
Seq Scan on foo (cost=0.00..2.28 rows=128 width=4)
EXPLAIN
MYDB.SCH1(USER)=> EXPLAIN SELECT emp.* FROM emp,grp WHERE
emp.id=grp.grp_id;
NOTICE: QUERY PLAN:
Hash Join (cost=0.01..0.04 rows=10000 width=28)
-> Seq Scan on emp (cost=0.00..0.01 rows=1000 width=28)
-> Hash (cost=0.01..0.01 rows=1000 width=4)
-> Seq Scan on grp (cost=0.00..0.01 rows=1000 width=4)
EXPLAIN
MYDB.SCH1(USER)=> EXPLAIN SELECT
l_orderkey,
sum(l_extendedprice * (1 - l_discount)) as revenue,
o_orderdate,
o_shippriority
FROM
customer,
orders,
lineitem
WHERE c_mktsegment = 'BUILDING'
and c_custkey = o_custkey
and l_orderkey = o_orderkey
and o_orderdate < date '1995-03-15'
and l_shipdate > date '1995-03-15'
GROUP BY
l_orderkey,
o_orderdate,
o_shippriority
ORDER BY revenue desc,
o_orderdate
LIMIT 10;
NOTICE: QUERY PLAN:
Limit (cost=315799480130.29..315799480130.29 rows=10 width=28)
-> Sort (cost=315799480130.29..315799480130.29 rows=360899981912
width=28)
-> Aggregate (cost=19476.76..112854066.90 rows=360899981912
width=28)
-> Group (cost=19476.76..72822.55 rows=360899981912 width=28)
-> Hash Join (cost=19476.76..43432.67 rows=31349208 width=28)
-> Seq Scan on lineitem (cost=0.00..17842.17 rows=322475815
width=20)
-> Hash (cost=19476.76..19476.76 rows=14582120 width=12)
-> Hash Join (cost=1347.66..19476.76 rows=14582120
width=12)
-> Seq Scan on orders (cost=0.00..3606.62
rows=72910603 width=16)
-> Hash (cost=550.60..550.60 rows=3000000 width=4)
-> Seq Scan on customer (cost=0.00..550.60
rows=3000000 width=4)
EXPLAIN
dev(admin)=> EXPLAIN DISTRIBUTION SELECT COUNT(*),grp FROM emp
GROUP BY grp;
NOTICE: Result-set distribution (for "CREATE TABLE AS")
Distributed on hash: "grp"
EXPLAIN