pg_plan_advice: cómo estabilizar y experimentar con planes de consulta en PostgreSQL

Fuentes: F.30. pg_plan_advice — help the planner get the right plan

pg_plan_advice es un módulo para PostgreSQL que permite describir, reproducir y modificar decisiones clave del planificador de consultas mediante un mini-lenguaje específico llamado "plan advice". Su objetivo es doble: por un lado, estabilizar planes de ejecución que el usuario considera buenos y, por otro, experimentar con planes que el planificador juzga como no óptimos.

El módulo funciona como una extensión que se carga en el servidor, bien añadiéndolo a shared_preload_libraries con un reinicio, a session_preload_libraries al iniciar una nueva sesión, o mediante el comando LOAD en una sesión concreta. Una vez cargado, la orden EXPLAIN incorpora la opción PLAN_ADVICE, que muestra una cadena con las decisiones tomadas por el planificador (orden de joins, métodos de join, métodos de acceso, uso de paralelismo, etc.).

El usuario puede fijar la variable pg_plan_advice.advice con una cadena de advice para forzar que el planificador siga unas directrices concretas en una consulta, y EXPLAIN devuelve realimentación indicando si cada pieza de advice fue aplicada ("matched") o solo parcialmente ("partially matched"). En la práctica, pg_plan_advice no reemplaza al planificador, sino que restringe sus opciones: el plan resultante siempre debe ser uno que el planificador habría considerado viable. Por ello, especificar advice contradictorio o inviable puede producir planes marcados como Disabled: true, a menudo peores que los obtenidos sin advice.

La documentación advierte del riesgo de usar esta herramienta: si la distribución de los datos cambia, un advice rígido puede impedir que el planificador adapte el plan y provocar caídas de rendimiento severas. Se recomienda, por tanto, validar siempre que el advice se aplique correctamente a la consulta esperada. La sintaxis completa cubre casos complejos con subconsultas, tablas particionadas y alias repetidos, e incluye definiciones formales de advice targets y advice tags.