*Isu Prestasi PostgreSQL: `(func()).` Sintaks dan Panggilan Fungsi Berlebihan**
Artikel ini mengkaji masalah prestasi dalam PostgreSQL yang berkaitan dengan sintaks (func()).*
apabila digunakan dengan fungsi yang mengembalikan jenis atau set komposit. Pemerhatian asal, ditunjukkan dalam pertanyaan di bawah, menyerlahkan tingkah laku yang tidak dijangka:
<code class="language-sql">SELECT (func(3)).*; -- Leads to multiple function calls</code>
Masalahnya: Penilaian Fungsi Berlebihan
Isu terasnya ialah (func()).*
mencetuskan panggilan fungsi yang berasingan untuk setiap lajur dalam output fungsi. Fungsi yang mengembalikan empat lajur, sebagai contoh, mungkin menghasilkan lapan panggilan fungsi dan bukannya dua yang dijangkakan. Ini sangat berbeza dengan sintaks alternatif, seperti:
<code class="language-sql">SELECT N, func(N); -- More efficient approach</code>
Penyelesaian: Penulisan Semula Pertanyaan yang Cekap
Untuk memintas panggilan yang berlebihan, subkueri menyediakan penyelesaian. Walaupun secara amnya berkesan, ini bukan penyelesaian yang sempurna dan mungkin memperkenalkan pertimbangan prestasi lain.
Untuk PostgreSQL 9.3 dan lebih baru, kata kunci LATERAL
menawarkan penyelesaian unggul:
<code class="language-sql">SELECT mf.* FROM some_table LEFT JOIN LATERAL my_func(some_table.x) AS mf ON true;</code>
Punca Punca: Gelagat Penghurai PostgreSQL
Punca utama terletak pada cara penghurai PostgreSQL mengendalikan kad bebas *
dalam binaan (func()).*
. Peluasan kad bebas ke dalam lajur individu semasa penghuraian ialah sumber panggilan fungsi berlebihan.
Tanda Aras Prestasi dan Demonstrasi
Contoh fungsi tersuai menunjukkan percanggahan prestasi antara sintaks yang bermasalah dan penyelesaian yang dicadangkan. Ujian menunjukkan bahawa pendekatan subkueri (atau CTE) menawarkan peningkatan prestasi yang ketara.
Kesimpulan: Mengoptimumkan Pertanyaan dalam PostgreSQL
Walaupun isu panggilan berbilang fungsi dengan (func()).*
kekal sebagai tingkah laku yang diketahui, penyelesaiannya, terutamanya menggunakan LATERAL
(PostgreSQL 9.3 ), menyediakan strategi yang berkesan untuk pembangun mengoptimumkan prestasi pertanyaan dan mengurangkan penilaian fungsi yang tidak diperlukan.
Atas ialah kandungan terperinci Mengapa Adakah `(func()).*` dalam PostgreSQL Menyebabkan Penilaian Pelbagai Fungsi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!