EXPLAIN ANALYZE non mostra dettagli per le query all'interno di una funzione plpgsql


18

Sto usando una funzione PL / pgSQL in PostgreSQL 9.3 con diverse query complesse all'interno:

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;

Se corro EXPLAIN ANALYZE f1(), ottengo solo il tempo totale, ma nessun dettaglio. È possibile ottenere risultati dettagliati per tutte le query nella funzione?

Se le domande nella funzione non dovessero essere ottimizzate da Postgres, chiederei anche una spiegazione.


2
auto_explain.log_nested_statementspotrebbe aiutare. Vedi postgresql.org/docs/9.3/static/auto-explain.html
Daniel Vérité,

Risposte:


15

Innanzitutto, la sintassi corretta per la EXPLAINchiamata richiede a SELECT. Non puoi semplicemente scrivere il nome della funzione nuda in SQL:

EXPLAIN ANALYZE SELECT f1();

Ottimizzazione

Le funzioni PL / pgSQL sono caselle nere per il planner delle query. Le query all'interno sono ottimizzate proprio come le altre query, ma separatamente e una per una come istruzioni preparate e il piano di esecuzione può essere memorizzato nella cache per la durata della sessione. Dettagli:

EXPLAIN corpi funzionali

Come già commentato @Daniel, è possibile utilizzare il modulo aggiuntivo auto_explain per ottenere maggiori dettagli ( molti dettagli). Le istruzioni all'interno delle funzioni di plpgsql sono considerate "istruzioni nidificate". Assicurati di impostare

SET auto_explain.log_nested_statements = ON

Istruzioni dettagliate:

Come eccezione alla regola, le funzioni SQL molto semplici (non plpgsql) possono essere "inline", ovvero il codice della funzione viene inserito nella query esterna e tutto viene eseguito come se non ci fosse una funzione per cominciare. Il piano di query include informazioni dettagliate in tali casi.


Dopo aver abilitato 'auto_explain' come sotto, carica 'auto_explain'; imposta auto_explain.log_min_duration = 0; imposta auto_explain.log_nested_statements = ON; SET auto_explain.log_analyze = true; Sto arrivando al di sotto di msg nel file di registro, '2014-12-08 18:21:59 IST LOG: impossibile ricevere dati dal client: nessuna connessione potrebbe essere stabilita perché la macchina di destinazione ha rifiutato attivamente' qualcuno può guidarmi che è il vero problema ....
skumar

Nota: dopo aver eseguito la funzione plpgsql sto solo superando msg nel file di registro.
skumar,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.