Explain

From PostgreSQL wiki
Jump to navigationJump to search

Nota de Gilberto Castillo: El artículo lo encontré en Google y le hice algunas modificaciones.

EXPLAIN :Muestra Plan de consulta explícito del backend Postgres.

EXPLAIN [ VERBOSE ] consulta

VERBOSE :Bandera para mostrar el plan detallado de la consulta.

Entradas

   Cualquier consulta. 

Salidas

NOTICE: QUERY PLAN: plan

Descripción


Este comando muestra el plan de ejecución que el planificador Postgres genera para la consulta dada. El plan de ejecución muestra la manera en que serán escaneadas las tablas referenciadas; ya sea escaneo secuencial plano, escaneo por índice, etc. En el caso que se referencian varias tablas, los algoritmos de unión que serán utilizados para agrupar las tuplas requeridas de cada tabla de entrada.

La opción VERBOSE emite la representación interna completa del árbol del plan, en vez de un resumen (y lo envía al archivo log del postmaster también). Usualmente esta opción es únicamente útil para la corrección de errores (debug) de Postgres.

Ejemplo 1. Para mostrar un plan de consulta para una consulta simple sobre una tabla con una única columna de tipo int4:

EXPLAIN SELECT * FROM foo;
   NOTICE:  QUERY PLAN:
Seq Scan on foo  (cost=0.00..2.28 rows=128 width=4)
      *.Costo inicio estimado (tiempo inicial que toma devolverse la primer tupla)
      *.Costo total estimado (tiempo total para devolver todas las tuplas: por ejemplo, si se limita el número de tuplas a devolver con una cláusula
        LIMIT, el planificador realiza una interpolación apropiada entre los dos costos finales para estimar cuál de los planes es realmente el menos
        costoso.)
      *.Número estimado de filas escaniadas (Se cumple solamente si la ejecución de la consulta es completa.)
      *.Cantidad estimado de filas de salida. 

El costo estimados es (disk pages read * seq_page_cost) + (rows scanned * cpu_tuple_cost). Por defecto, seq_page_cost is 1.0 y cpu_tuple_cost is 0.01. Valor costo estimado es (2,24 * 1.0) + (4 * 0.01) = 2.28

seq_page_cost (floating point)
  La suposición del planificador sobre el costo medido en unidades de captura de páginas de disco. Por defecto es 1.0. 
cpu_tuple_cost (floating point)
  La suposición del planificador sobre el costo de procesamiento de cada fila durante la consulta. Por defecto es 0.01.

Ejemplo 2. Para la misma tabla con un índice para lograr una condición equijoin en la consulta, EXPLAIN mostrará un plan distinto:

EXPLAIN SELECT * FROM foo WHERE i = 4;
   NOTICE:  QUERY PLAN:
Index Scan using fi on foo  (cost=0.00..0.42 rows=1 width=4)

Ejemplo 3. Para terminar, la misma tabla con un índice para lograr una condición equijoin en la consulta, EXPLAIN mostrará lo siguiente para una consulta que utilice una función de agregación:

EXPLAIN SELECT sum(i) FROM foo WHERE i = 4;
   NOTICE:  QUERY PLAN:
Aggregate  (cost=0.42..0.42 rows=1 width=4)
 ->  Index Scan using fi on foo  (cost=0.00..0.42 rows=1 width=4)
   

Resumen


Explain es la presentación del costo estimado de ejecución de la consulta, que es la suposición del planificador sobre el tiempo que tomará correr la consulta (medido en unidades de captura de páginas de disco). Muestran dos números: el tiempo inicial que toma devolverse la primer tupla, y el tiempo total para devolver todas las tuplas. Para la mayoría de las consultas lo que importa es el tiempo total, pero en algunos casos como una sub-consulta EXISTS el planificador escogerá el menor tiempo inicial en vez del menor tiempo total (ya que en todo caso el ejecutor se detendrá después de obtener la primer tupla). También, si se limita el número de tuplas a devolver con una cláusula LIMIT, el planificador realiza una interpolación apropiada entre los dos costos finales para estimar cuál de los planes es realmente el menos costoso.