PostgreSQL permite analizar el plan de una consulta mediante:
EXPLAIN
y ejecutar la consulta mostrando información real mediante:
EXPLAIN ANALYZE
El plan permite conocer:
Al analizar un plan buscamos principalmente:
La pregunta principal es:
¿PostgreSQL está procesando más información de la necesaria?
Entre los principales métodos encontramos:
Un Seq Scan puede indicar una oportunidad para utilizar un índice, pero también puede ser perfectamente correcto cuando necesitamos una gran cantidad de registros.
PostgreSQL utiliza principalmente:
El Optimizer decide cuál utilizar basándose en estadísticas, cardinalidad y costos estimados.
Una de las características más importantes es poder comparar:
Estimated Rows
vs.
Actual Rows
Por ejemplo:
rows=100
actual rows=2.000.000
Una diferencia de este tipo puede explicar por qué PostgreSQL seleccionó una estrategia poco eficiente.
También podemos analizar:
Si encontramos un Seq Scan costoso, podemos analizar:
Por ejemplo:
ANALYZE clientes;
puede actualizar la información estadística utilizada por el Planner.
Después podemos volver a ejecutar:
EXPLAIN ANALYZE
y comparar el resultado.
PostgreSQL no dispone nativamente de un mecanismo equivalente a SQL Server Forced Plans o Oracle SQL Plan Baselines para fijar un plan completo.
Sin embargo, permite influir en determinadas decisiones del Planner.
Por ejemplo, existen controles relacionados con:
Esto permite orientar el comportamiento del Optimizer en situaciones específicas.
PostgreSQL también permite controlar cómo se utilizan los planes asociados a prepared statements.
En determinados escenarios puede utilizar:
Esta distinción puede ser importante cuando una misma consulta presenta comportamientos muy diferentes dependiendo de los valores utilizados.
Dependiendo del problema podemos:
Después se vuelve a ejecutar EXPLAIN ANALYZE y se comparan los resultados.
El objetivo es conseguir que PostgreSQL:
lea menos → procese menos → utilice menos recursos → responda más rápido.
EXPLAIN ANALYZE permite comprobar no solamente qué plan eligió PostgreSQL, sino también cómo se comportó realmente durante la ejecución.