EXPLAIN ANALYZE не показывает детали для запросов внутри функции plpgsql

18

Я использую функцию 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, я бы также попросил объяснения.

skumar
источник
2
auto_explain.log_nested_statementsможет помочь. См. Postgresql.org/docs/9.3/static/auto-explain.html
Даниэль Верите

Ответы:

15

Во-первых, правильный синтаксис для EXPLAINвызова нуждается в SELECT. Вы не можете просто написать голое имя функции в SQL:

EXPLAIN ANALYZE SELECT f1();

оптимизация

Функции PL / pgSQL - это черные ящики для планировщика запросов. Запросы внутри будут оптимизированы так же , как другие запросы, но отдельно и один за другим , как подготовленные заявления, и план выполнения может быть кэшируются на время сессии. Детали:

EXPLAIN функциональные органы

Как уже прокомментировал @Daniel, вы можете использовать дополнительный модуль auto_explain, чтобы получить больше деталей ( много деталей). Операторы внутри функций plpgsql считаются «вложенными операторами». Обязательно установите

SET auto_explain.log_nested_statements = ON

Подробные инструкции:

Как исключение из правила, очень простые функции SQL (не plpgsql) могут быть «встроенными», то есть код функции вставляется во внешний запрос, и все выполняется так, как если бы не было функции с самого начала. План запроса включает в себя подробную информацию в таких случаях.

Эрвин Брандштеттер
источник
После включения «auto_explain», как показано ниже, загрузите «auto_explain»; set auto_explain.log_min_duration = 0; set auto_explain.log_nested_statements = ON; SET auto_explain.log_analyze = true; Я получаю ниже msg в файле журнала, '2014-12-08 18:21:59 IST LOG: не удалось получить данные от клиента: невозможно установить соединение, потому что целевая машина активно отказывала в этом' может кто-нибудь подсказать мне, что это актуальный вопрос ....
skumar
Примечание: после запуска только функции plpgsql я получаю выше msg в лог-файле.
skumar