Rumah > pangkalan data > tutorial mysql > Bagaimana untuk Mengelakkan Penilaian Pelbagai Fungsi dengan Sintaks `(func()).*` PostgreSQL?

Bagaimana untuk Mengelakkan Penilaian Pelbagai Fungsi dengan Sintaks `(func()).*` PostgreSQL?

Barbara Streisand
Lepaskan: 2025-01-10 12:00:04
asal
516 orang telah melayarinya

How to Avoid Multiple Function Evaluations with PostgreSQL's `(func()).*` Syntax?

Mengoptimumkan Pertanyaan PostgreSQL: Mengelakkan Panggilan Fungsi Berlebihan dengan (func()).*

Menggunakan sintaks (func()).* dalam PostgreSQL untuk mengakses hasil daripada fungsi yang mengembalikan jenis komposit atau TABLE boleh membawa kepada isu prestasi disebabkan penilaian fungsi yang berulang. Ini berlaku kerana sintaks berkembang menjadi rujukan berbilang lajur, setiap satu mencetuskan panggilan fungsi yang berasingan. Bilangan panggilan sama dengan bilangan lajur dalam set hasil.

Masalahnya: Panggilan Pelbagai Fungsi yang Tidak Cekap

Pendekatan (func()).* adalah tidak cekap kerana ia tidak mengoptimumkan untuk panggilan fungsi yang minimum. Sebaik-baiknya, fungsi perlu dipanggil sekali sahaja untuk mendapatkan keseluruhan set hasil.

Penyelesaian:

PostgreSQL 9.3 dan kemudian menawarkan penyelesaian yang mudah menggunakan LATERAL bergabung:

<code class="language-sql">SELECT mf.*
FROM some_table
LEFT JOIN LATERAL my_func(some_table.x) AS mf ON true;</code>
Salin selepas log masuk

LATERAL memastikan bahawa my_func dilaksanakan sekali sahaja setiap baris dalam some_table, meningkatkan prestasi dengan ketara.

Untuk versi PostgreSQL yang lebih lama (sebelum 9.3), penyelesaian diperlukan:

Penyelesaian 1: OFFSET 0 Hack

Kaedah ini memanfaatkan klausa OFFSET 0 untuk memaksa penilaian fungsi tunggal:

<code class="language-sql">SELECT (mf).* FROM (
    SELECT my_func(x) AS mf FROM some_table OFFSET 0
) sub;</code>
Salin selepas log masuk

Penyelesaian 2: Ungkapan Jadual Biasa (CTE)

CTE menyediakan alternatif yang lebih bersih:

<code class="language-sql">WITH tmp AS (
    SELECT my_func(x) FROM some_table
)
SELECT (mf).* FROM tmp;</code>
Salin selepas log masuk

Kedua-dua penyelesaian memastikan my_func dipanggil sekali sahaja, mendapatkan set hasil lengkap sebelum mengakses lajur individu.

Punca Punca: Peluasan Parser

Berbilang penilaian timbul daripada cara penghurai PostgreSQL mentafsir (func()).*. Ia menterjemahkannya ke dalam akses lajur yang berasingan, menghasilkan pelbagai panggilan fungsi. Had ini telah ditangani dalam versi yang lebih baharu dengan pengenalan LATERAL menyertai.

Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan Penilaian Pelbagai Fungsi dengan Sintaks `(func()).*` PostgreSQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan