Ini memperkirakan 1000 baris
1000
baris yang diperkirakan adalah nilai default yang didokumentasikan dalam CREATE FUNCTION
:
Ketika suatu fungsi dinyatakan volatil, ia meminta untuk tidak disejajarkan, jadi nilai default untuk result_rows
ini berlaku.
Di sisi lain, ketika dimasukkan ke dalam kueri seperti pada pengujian kedua Anda, jumlah baris akan diperkirakan seolah-olah badan fungsi telah dipindahkan ke kueri dan deklarasi fungsi tidak ada. Ini mengarah pada pengujian kedua ke perkiraan yang tepat sejak VALUES
klausa dapat langsung dievaluasi.
Apa sebenarnya yang dilakukan perencana di sini, dan di mana saya dapat membaca beberapa dokumentasi tentangnya?
Secara umum, strategi pengoptimalan perencana tidak dijelaskan dalam dokumentasi utama. Mereka dibahas dalam milis dan disebutkan dalam komentar kode sumber, yang untungnya cenderung sangat jelas dan ditulis dengan baik (dibandingkan dengan kode sumber rata-rata). Dalam hal fungsi inlining, saya percaya komentar dari inline_set_returning_functions dan inline_set_returning_function mengungkapkan sebagian besar aturan yang mendorong pengoptimalan khusus ini. (peringatan:tautan di atas masuk ke cabang master saat ini yang dapat berubah atau melayang kapan saja).