Я использую функцию PL / pgSQL в PostgreSQL 9.3 с несколькими сложными запросами внутри:
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;
Если я бегу EXPLAIN ANALYZE f1()
, я получаю только общее время, но без подробностей. Есть ли способ получить подробные результаты по всем запросам в функции?
Если запросы в функции не должны быть оптимизированы Postgres, я бы также попросил объяснения.
auto_explain.log_nested_statements
может помочь. См. Postgresql.org/docs/9.3/static/auto-explain.htmlОтветы:
Во-первых, правильный синтаксис для
EXPLAIN
вызова нуждается вSELECT
. Вы не можете просто написать голое имя функции в SQL:оптимизация
Функции PL / pgSQL - это черные ящики для планировщика запросов. Запросы внутри будут оптимизированы так же , как другие запросы, но отдельно и один за другим , как подготовленные заявления, и план выполнения может быть кэшируются на время сессии. Детали:
EXPLAIN
функциональные органыКак уже прокомментировал @Daniel, вы можете использовать дополнительный модуль auto_explain, чтобы получить больше деталей ( много деталей). Операторы внутри функций plpgsql считаются «вложенными операторами». Обязательно установите
Подробные инструкции:
Как исключение из правила, очень простые функции SQL (не plpgsql) могут быть «встроенными», то есть код функции вставляется во внешний запрос, и все выполняется так, как если бы не было функции с самого начала. План запроса включает в себя подробную информацию в таких случаях.
источник