EXPLAIN ANALYZE tidak menunjukkan detail untuk kueri di dalam fungsi plpgsql

18

Saya menggunakan fungsi PL / pgSQL di PostgreSQL 9.3 dengan beberapa pertanyaan kompleks di dalamnya:

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;

Jika saya berlari EXPLAIN ANALYZE f1(), saya hanya mendapatkan total waktu, tetapi tidak ada detail. Apakah ada cara saya bisa mendapatkan hasil terperinci untuk semua pertanyaan dalam fungsi?

Jika pertanyaan dalam fungsi tidak dioptimalkan oleh Postgres, saya juga akan meminta penjelasan.

skumar
sumber
2
auto_explain.log_nested_statementsmungkin membantu. Lihat postgresql.org/docs/9.3/static/auto-explain.html
Daniel Vérité

Jawaban:

15

Pertama, sintaks yang benar untuk EXPLAINpanggilan membutuhkan a SELECT. Anda tidak bisa hanya menulis nama fungsi kosong di SQL:

EXPLAIN ANALYZE SELECT f1();

Optimasi

Fungsi PL / pgSQL adalah kotak hitam untuk perencana kueri. Query dalam yang dioptimalkan seperti pertanyaan lain, tetapi secara terpisah dan satu per satu seperti pernyataan, dan rencana eksekusi dapat di-cache selama sesi. Detail:

EXPLAIN fungsi tubuh

Seperti @Daniel yang sudah berkomentar, Anda dapat menggunakan modul tambahan auto_explain untuk mendapatkan detail lebih banyak ( banyak detail). Pernyataan di dalam fungsi plpgsql dianggap "pernyataan bersarang". Pastikan untuk mengatur

SET auto_explain.log_nested_statements = ON

Instruksi terperinci:

Sebagai pengecualian terhadap aturan tersebut, fungsi SQL yang sangat sederhana (bukan plpgsql) dapat "digariskan", yaitu kode fungsi dimasukkan ke dalam kueri luar dan semuanya dijalankan seperti tidak ada fungsi untuk memulai. Rencana kueri mencakup informasi terperinci dalam kasus tersebut.

Erwin Brandstetter
sumber
Setelah mengaktifkan 'auto_explain' seperti di bawah ini, muat 'auto_explain'; atur auto_explain.log_min_duration = 0; set auto_explain.log_nested_statements = ON; SET auto_explain.log_analyze = true; Saya mendapatkan di bawah msg dalam file log, '2014-12-08 18:21:59 IST LOG: tidak dapat menerima data dari klien: Tidak ada koneksi yang dapat dibuat karena mesin target secara aktif menolaknya' adakah yang bisa membimbing saya apa masalah yang sebenarnya ....
skumar
Catatan: Setelah menjalankan fungsi plpgsql hanya saya mendapatkan msg di atas dalam file log.
skumar