EXPLAIN ANALYZE no muestra detalles para consultas dentro de una función plpgsql

18

Estoy usando una función PL / pgSQL en PostgreSQL 9.3 con varias consultas complejas dentro:

create function f1()
  returns integer as
$$
declare

event tablename%ROWTYPE;
....
....

begin

FOR event IN
   SELECT * FROM tablename WHERE condition
LOOP
   EXECUTE 'SELECT f2(event.columnname)' INTO dummy_return;
END LOOP;

...

INSERT INTO ... FROM a LEFT JOIN b ... LEFT JOIN c WHERE ...

UPDATE T SET cl1 = M.cl1 FROM M WHERE M.pkcols = T.pkcols;

...

end
$$ language plpgsql;

Si corrí EXPLAIN ANALYZE f1(), solo obtengo el tiempo total, pero no detalles. ¿Hay alguna manera de obtener resultados detallados para todas las consultas en la función?

Si Postgres no optimizara las consultas en la función, también pediría una explicación.

skumar
fuente
2
auto_explain.log_nested_statementspodría ayudar. Ver postgresql.org/docs/9.3/static/auto-explain.html
Daniel Vérité

Respuestas:

15

Primero, la sintaxis correcta para la EXPLAINllamada necesita a SELECT. No puede simplemente escribir el nombre de la función desnuda en SQL:

EXPLAIN ANALYZE SELECT f1();

Mejoramiento

Las funciones PL / pgSQL son cuadros negros para el planificador de consultas. Las consultas internas se optimizan al igual que otras consultas, pero por separado y una por una, como las declaraciones preparadas, y el plan de ejecución puede almacenarse en caché durante la sesión. Detalles:

EXPLAIN cuerpos funcionales

Como @Daniel ya comentó, puede usar el módulo adicional auto_explain para obtener más detalles ( muchos detalles). Las declaraciones dentro de las funciones plpgsql se consideran "declaraciones anidadas". Asegúrese de configurar

SET auto_explain.log_nested_statements = ON

Instrucciones detalladas:

Como excepción a la regla, las funciones SQL muy simples (no plpgsql) pueden estar "en línea", es decir, el código de función se inserta en la consulta externa y todo se ejecuta como si no hubiera una función para empezar. El plan de consulta incluye información detallada en tales casos.

Erwin Brandstetter
fuente
Después de habilitar 'auto_explain' como se muestra a continuación, cargue 'auto_explain'; establecer auto_explain.log_min_duration = 0; establecer auto_explain.log_nested_statements = ON; SET auto_explain.log_analyze = true; Me estoy poniendo por debajo del mensaje en el archivo de registro, '2014-12-08 18:21:59 REGISTRO IST: no se pudieron recibir datos del cliente: No se pudo establecer una conexión porque la máquina de destino lo rechazó activamente' alguien puede guiarme el problema real ...
skumar
Nota: Después de ejecutar la función plpgsql, solo estoy superando el mensaje en el archivo de registro.
skumar