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, я також попросив би пояснення.


2
auto_explain.log_nested_statementsможе допомогти. Дивіться postgresql.org/docs/9.3/static/auto-explain.html
Daniel Vérité

Відповіді:


15

По-перше, правильний синтаксис для EXPLAINвиклику потребує a 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"; встановити auto_explain.log_min_duration = 0; встановити auto_explain.log_nested_statements = ON; SET auto_explain.log_analyze = вірно; Я опускаюсь нижче msg у файлі журналу, '2014-12-08 18:21:59 IST LOG: не вдалося отримати дані від клієнта: підключення не вдалося зробити, тому що цільова машина активно відмовилась від нього' може хто-небудь керівник мені, що це власне питання ....
skumar

Примітка. Після запуску лише функції plpgsql я переходжу над msg у файл журналу.
скумар
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.