EXPLICAR

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).

Si se hace referencia a varias tablas, el plan de ejecución especifica qué algoritmos de unión se utilizan para reunir las tuplas necesarias de cada tabla de entrada. El plan de ejecución incluye una estimación del coste de la ejecución de las consultas; es decir, el número de milisegundos necesarios para ejecutar la consulta.
  • Se puede devolver la hora de inicio antes de la primera tupla.
  • El tiempo total para devolver todas las tuplas.
Si se limita el número de tuplas que devolver mediante una cláusula de límite, el planificador interpola entre los costes del punto final para calcular qué plan es el más eficaz realmente.

Sintaxis

Sintaxis para el comando EXPLAIN:
EXPLAIN [VERBOSE] [DISTRIBUTION] [PLANTEXT|PLANGRAPH] <query>

Entradas

El comando EXPLAIN toma las siguientes entradas:
Tabla 1. Entrada de EXPLAIN
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.
DISTRIBUCIÓN 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.

Resultados

El comando EXPLAIN tiene las siguientes salidas:
Tabla 2. Salidas de EXPLAIN
Resultado 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.

Privilegios

Este comando no requiere privilegios especiales.

Uso

Se proporciona el siguiente uso de muestra.
  • Mmostrar un plan de consulta para una consulta simple de una tabla con una única columna int4 y 128 filas:
    MYDB.SCH1(USER)=> EXPLAIN SELECT * FROM foo;
           NOTICE:  QUERY PLAN:
       Seq Scan on foo  (cost=0.00..2.28 rows=128 width=4)
       EXPLAIN
  • Mostrar un plan de consulta para una unión entre las tablas emp y grp:
    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
  • Mostrar un plan de consulta para TPHC Query 3:
    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
  • Mostrar la distribución desde una sentencia SELECT de un comando CTAS:
       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