EXPLAIN ANALYZE nie pokazuje szczegółów zapytań w funkcji plpgsql

18

Korzystam z funkcji PL / pgSQL w PostgreSQL 9.3 z kilkoma złożonymi zapytaniami wewnątrz:

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;

Gdybym pobiegł EXPLAIN ANALYZE f1(), dostaję tylko całkowity czas, ale żadnych szczegółów. Czy istnieje sposób, aby uzyskać szczegółowe wyniki dla wszystkich zapytań w funkcji?

Jeśli zapytania w funkcji nie powinny być optymalizowane przez Postgres, poprosiłbym również o wyjaśnienie.

skumar
źródło
2
auto_explain.log_nested_statementsmoże pomóc. Zobacz postgresql.org/docs/9.3/static/auto-explain.html
Daniel Vérité

Odpowiedzi:

15

Po pierwsze, poprawna składnia EXPLAINpołączenia wymaga SELECT. Nie można po prostu napisać czystej nazwy funkcji w SQL:

EXPLAIN ANALYZE SELECT f1();

Optymalizacja

Funkcje PL / pgSQL są czarnymi skrzynkami dla narzędzia do planowania zapytań. Zapytania wewnątrz zoptymalizowane, podobnie jak inne zapytania, ale osobno i jedno po drugim, podobnie jak przygotowane instrukcje, a plan wykonania może być buforowany na czas trwania sesji. Detale:

EXPLAIN ciała funkcyjne

Jak już skomentował @Daniel, możesz użyć dodatkowego modułu auto_explain, aby uzyskać więcej szczegółów ( wiele szczegółów). Instrukcje wewnątrz funkcji plpgsql są uważane za „instrukcje zagnieżdżone”. Pamiętaj, aby ustawić

SET auto_explain.log_nested_statements = ON

Szczegółowe instrukcje:

Jako wyjątek od reguły, bardzo proste funkcje SQL (nie plpgsql) mogą być „wstawiane”, tj. Kod funkcji jest wstawiany do zewnętrznego zapytania i wszystko jest wykonywane tak, jakby nie było funkcji na początek. W takich przypadkach plan zapytań zawiera szczegółowe informacje.

Erwin Brandstetter
źródło
Po włączeniu „auto_explain” jak poniżej, załaduj „auto_explain”; ustaw auto_explain.log_min_duration = 0; ustaw auto_explain.log_nested_statements = ON; SET auto_explain.log_analyze = true; W pliku dziennika pojawia się komunikat „2014-12-08 18:21:59 IST LOG: nie można odebrać danych od klienta: nie można nawiązać połączenia, ponieważ maszyna docelowa aktywnie go odmawia”, czy ktoś może mnie poprowadzić faktyczny problem ....
skumar
Uwaga: po uruchomieniu funkcji plpgsql w pliku logu przekraczam msg.
skumar