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.
auto_explain.log_nested_statements
podría ayudar. Ver postgresql.org/docs/9.3/static/auto-explain.htmlRespuestas:
Primero, la sintaxis correcta para la
EXPLAIN
llamada necesita aSELECT
. No puede simplemente escribir el nombre de la función desnuda en SQL: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 funcionalesComo @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
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.
fuente