Analizador EXPLAIN de PostgreSQL

Pega el plan JSON de EXPLAIN (ANALYZE, BUFFERS, FORMAT JSON) para ver su árbol y los puntos calientes que esta página detecta localmente. El plan se analiza en tu navegador: no se ejecuta la consulta ni se contacta ninguna base de datos.

Se ejecuta localmente en tu navegador
Esta herramienta procesa todos los datos localmente en tu navegador.
JSON de EXPLAINPega el resultado JSON; la base de datos nunca se contacta.

Cómo leer un plan de ejecución de PostgreSQL desde el JSON de EXPLAIN

Pega la salida JSON de EXPLAIN (ANALYZE, BUFFERS, FORMAT JSON) y pulsa Analizar plan. La página dibuja el árbol del plan, suma nodos, coste, tiempo real y filas, y enumera los puntos calientes que puede reconocer localmente.

El plan se analiza en el navegador; no se ejecuta ninguna sentencia y nada se envía a una base de datos ni a este sitio. Solo se lee el formato JSON: el formato de texto de psql no sirve como sustituto.

  1. Ejecuta la consulta con EXPLAIN (ANALYZE, BUFFERS, FORMAT JSON) — con ANALYZE, porque si no hay filas ni tiempos reales que comparar.
  2. Pega el resultado completo (el array exterior vale) en el cuadro y pulsa Analizar plan.
  3. Lee primero el resumen: número de nodos, coste total más alto, tiempo de ejecución y filas devueltas en la raíz.
  4. Revisa la lista de hallazgos: desvíos de estimación, filas descartadas por un filtro, lados internos ejecutados muchas veces y el nodo más lento son los que merecen acción.
  5. Corrige una cosa a la vez (un índice, una reescritura, el objetivo de estadísticas) y vuelve a ejecutar el plan para ver si los números cambian.

Qué informa el analizador, qué no puede ver y cómo usarlo

Qué informa el analizador

El resumen muestra el número de nodos, el Total Cost más alto del árbol, el tiempo de ejecución (Execution Time si existe; si no, el nodo más lento) y las filas que devolvió el nodo raíz. El árbol repite coste, tiempo real, filas, bucles, la estimación y la condición de índice o filtro de cada nodo.

La lista de hallazgos compara Plan Rows con las filas realmente devueltas: cuando difieren diez veces o más, el nodo aparece con ambos números. También informa de un filtro que descartó al menos diez veces más filas de las que devolvió, de un lado interno ejecutado mil veces o más y del nodo más lento cuando tarda al menos 50 ms y al menos un quinto del tiempo de ejecución.

Qué no puede ver

Un plan sin ANALYZE no tiene filas ni tiempos reales, así que la página lo indica y omite las métricas de tiempo en lugar de mostrar ceros; las comprobaciones de estimación se omiten por el mismo motivo. Los contadores de BUFFERS aparecen en el JSON pero aquí no se interpretan, y el JIT, el reparto entre workers paralelos y el tiempo de disparadores o funciones no se analizan.

Un plan es una ejecución: una caché caliente, otras estadísticas, otro valor de parámetro o una sentencia preparada que reutiliza un plan genérico pueden dar un árbol distinto. Compara planes tomados en las mismas condiciones y trata los hallazgos como indicios que revisar, no como un veredicto.

Actuar sobre el resultado

Un desvío grande de estimación suele indicar estadísticas desactualizadas o un predicado que el planificador no puede estimar (una función sobre la columna, una condición correlacionada, una distribución poco común); ANALYZE, un objetivo de estadísticas mayor o reescribir el predicado suelen cambiar el plan antes de tocar ningún índice.

Las filas descartadas por un filtro apuntan a un índice ausente o no usado y a un predicado poco selectivo, mientras que un lado interno repetido en un bucle anidado es la señal clásica de un join que un hash join resolvería mejor. Cambia una cosa, vuelve a ejecutar con los mismos parámetros y quédate con el plan que gane en la carga que realmente usas.

Herramientas recientes: