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.
auto_explain.log_nested_statements
może pomóc. Zobacz postgresql.org/docs/9.3/static/auto-explain.htmlOdpowiedzi:
Po pierwsze, poprawna składnia
EXPLAIN
połączenia wymagaSELECT
. Nie można po prostu napisać czystej nazwy funkcji w SQL:Optymalizacja
Funkcje PL / pgSQL są czarnymi skrzynkami dla narzędzia do planowania zapytań. Zapytania wewnątrz są 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 funkcyjneJak 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ć
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.
źródło