EXPLAIN ANALYZE zeigt keine Details für Abfragen innerhalb einer plpgsql-Funktion an

18

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.

skumar
quelle
2
auto_explain.log_nested_statementskönnte helfen. Siehe postgresql.org/docs/9.3/static/auto-explain.html
Daniel Vérité

Antworten:

15

Zunächst muss die korrekte Syntax für den EXPLAINAufruf a SELECT. Sie können nicht einfach den Namen der bloßen Funktion in SQL schreiben:

EXPLAIN ANALYZE SELECT f1();

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örper

Wie @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

SET auto_explain.log_nested_statements = ON

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.

Erwin Brandstetter
quelle
Nachdem Sie das 'auto_explain' wie unten aktiviert haben, laden Sie 'auto_explain'. set auto_explain.log_min_duration = 0; set auto_explain.log_nested_statements = ON; SET auto_explain.log_analyze = true; Ich erhalte folgende Meldung in der Protokolldatei: '2014-12-08 18:21:59 IST-LOG: Konnte keine Daten vom Client empfangen: Es konnte keine Verbindung hergestellt werden, da der Zielcomputer sie aktiv abgelehnt hat.' das eigentliche Problem ....
skumar
Hinweis: Nach dem Ausführen der Funktion plpgsql wird in der Protokolldatei nur "msg" angezeigt.
Skumar