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.
auto_explain.log_nested_statements
mungkin membantu. Lihat postgresql.org/docs/9.3/static/auto-explain.htmlJawaban:
Pertama, sintaks yang benar untuk
EXPLAIN
panggilan membutuhkan aSELECT
. Anda tidak bisa hanya menulis nama fungsi kosong di SQL: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 tubuhSeperti @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
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.
sumber