Plan de ejecución en PostgreSQL. Cómo se obtiene

Hola a todos, hoy queríamos compartir con vosotros la forma de sacar un plan de ejecución en PostgreSQL y unas pautas básicas sobre como leerlo para explotar mejor el potencial de esta potente base de datos.

El comando que se utiliza para ver un plan de ejecución de una sentecia es EXPLAIN y un ejemplo de ejecución es la siguiente:

EXPLAIN ANALYZE SELECT * FROM polygon_tbl WHERE f1 @> polygon '(0.5,2.0)';
                                                         QUERY PLAN
 --------------------------------------------------------------------------------------------------------------------------
  Index Scan using gpolygonind on polygon_tbl  (cost=0.13..8.15 rows=1 width=32) (actual time=0.062..0.062 rows=0 loops=1)
    Index Cond: (f1 @> '((0.5,2))'::polygon)
    Rows Removed by Index Recheck: 1
  Planning time: 0.034 ms
  Execution time: 0.144 ms 

Sintaxis de EXPLAIN

La sintaxis completa es:

  • Sintaxis:
    • EXPLAIN [ ( option [, …] ) ] statement
    • Donde option puede ser alguno entre:

Una explicación de los comandos que se pueden utilizar es:

ANALYZE

Ejecuta el comando y muestra los tiempos de ejecución y otras estadísticas. Por defecto, su valor es FALSE. Para sentencias select, puede emplearse pero para otras hay que tener cuidado.

VERBOSE

Muestra información adicional sobre el plan. Incluye nombre de funciones, ruta completas de objetos con esquema, triggers, etc. Por defecto, su valor es FALSE.

COSTS

Incluye información sobre el coste de cada nodo del plan. También, el número estimado de filas. Por defecto es TRUE.

BUFFERS

Incluye información de utilización de buffers. Incluye los bloques compartidos, lecturas, bloques temporales utilizados, etc. Solo se puede utilizar con Analyze y por defecto es FALSE.

TIMING

Incluye tiempos de cada nodo del plan. Sólo se puede utilizar con Analyze. Por defecto, su valor es TRUE.

FORMAT

Indica el formato de salida, puede ser TEXT, XML, JSON o YAML. Todos los formatos contienen la misma información pero se utiliza para realizar parse desde aplicaciones de análisis. Por defecto es TEXT.

statement

Puede ser SELECT, INSERT, UPDATE, DELETE, VALUES, EXECUTE, DECLARE, CREATE TABLE AS o CREATE MATERIALIZED VIEW.

Como se suele leer un plan de ejecución en PostrgreSQL

PostgreSQL construye una estructura de árbol que representa las diferentes acciones que se realizan para resolver la consulta que vamos a ejecutar.

Un ejemplo puede ser:

plan de ejecución en PostrgreSQL

El formato de la salida es similar a este:

Sort
 └── Hash Join 
     ├── Seq Scan 
     └── Hash 
         └── Bitmap Heap Scan 
             └── Bitmap Index Scan 

La primera operación realizada es la más interna. En este caso es Bitmap Index Scan.

El costo estimado (cost=0.00..5.04 rows=101 width=0) significa que PostgreSQL espera que le “costará” 5.04 de su propia unidad de computación encontrar esos valores. El 0.00 es el coste desde el que el nodo puede empezar a trabajar. Rows es el número estimado de filas que el Index Scan devolverá. Por último, width es el tamaño estimado en bytes de las filas devueltas. Si devuelve 0, en este caso es porque está mirando la localización en el índice, no sobre los datos a devolver.

Como se ha ejecutado EXPLAIN con la opción ANALYZE, la query se ha ejecutado y la información de tiempos se ha capturado (actual time=0.049..0.049 rows=100 loops=1). Significa que el index scan se ha ejecutado una vez y ha devuelto 100 filas.

La información de cada uno de los nodos se envía al siguiente. Es por ello, que los costes de la consulta se van incrementando en cada paso. Se va haciendo sucesivamente hasta que se devuelven las filas que hemos pedido en la query.

Conclusión

A primera vista, puede parecer un poco complejo obtener un plan de ejecución en PostgreSQL. Lo mismo ocurre en el resto de gestores de bases de datos. Aun así, con un poco de práctica veremos que la información es muy completa. Esta información, nos será de mucha utilidad para ver problemas de rendimiento en nuestras consultas.

Esperamos que os haya sido de utilidad. Nos vemos en una nueva entrega sobre PostgreSQL.

Un saludo.

Equipo de base de datos

Si no quieres perderte trucos como este y estar al día de este mundo, suscríbete a nuestra newsletter. Te mantendremos informados con un solo email al mes.