Ich verwende eine PL / pgSQL-Funktion in PostgreSQL 9.3 mit mehreren komplexen Abfragen:
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;
Wenn ich renne EXPLAIN ANALYZE f1()
, bekomme ich nur die Gesamtzeit, aber keine Details. Gibt es eine Möglichkeit, detaillierte Ergebnisse für alle Abfragen in der Funktion zu erhalten?
Sollten Abfragen in der Funktion nicht von Postgres optimiert werden, würde ich auch um eine Erklärung bitten.
auto_explain.log_nested_statements
könnte helfen. Siehe postgresql.org/docs/9.3/static/auto-explain.htmlAntworten:
Zunächst muss die korrekte Syntax für den
EXPLAIN
Aufruf aSELECT
. Sie können nicht einfach den Namen der bloßen Funktion in SQL schreiben:Optimierung
PL / pgSQL-Funktionen sind Black Boxes für den Abfrageplaner. Abfragen im Inneren werden wie andere Abfragen optimiert, jedoch separat und nacheinander wie vorbereitete Anweisungen. Der Ausführungsplan kann für die Dauer der Sitzung zwischengespeichert werden. Einzelheiten:
EXPLAIN
FunktionskörperWie @Daniel bereits kommentiert hat, können Sie das Zusatzmodul auto_explain verwenden , um weitere Details zu erhalten ( viele Details). Anweisungen in plpgsql-Funktionen werden als "verschachtelte Anweisungen" betrachtet. Achten Sie darauf, einzustellen
Detaillierte Anleitung:
Als Ausnahme von der Regel können sehr einfache SQL-Funktionen (nicht plpgsql) "inline" sein, dh der Funktionscode wird in die äußere Abfrage eingefügt und alles wird so ausgeführt, als gäbe es anfangs keine Funktion. Der Abfrageplan enthält in solchen Fällen detaillierte Informationen.
quelle