Rumah >pangkalan data >tutorial mysql >Bagaimanakah PostgreSQL's LATERAL JOIN Mengoptimumkan Panggilan Berbilang Fungsi pada Argumen Tatasusunan?

Bagaimanakah PostgreSQL's LATERAL JOIN Mengoptimumkan Panggilan Berbilang Fungsi pada Argumen Tatasusunan?

Patricia Arquette
Patricia Arquetteasal
2024-12-26 20:52:10156semak imbas

How Can PostgreSQL's LATERAL JOIN Optimize Multiple Function Calls on Array Arguments?

Pengoptimuman Pertanyaan untuk Panggilan Berbilang Fungsi pada Argumen Tatasusunan

Dalam Postgres, ia boleh menjadi tidak cekap untuk memanggil fungsi berbilang kali pada argumen tatasusunan , terutamanya apabila fungsi mengembalikan berbilang lajur. Mari kita terokai strategi pengoptimuman pertanyaan untuk menangani cabaran ini.

Pertimbangkan fungsi foo yang memproses tatasusunan baris dengan parameter tertentu dan mengembalikan set baris serta lajur baharu:

CREATE OR REPLACE FUNCTION foo(data data[], parameter int) RETURNS SETOF enhanceddata AS
...

Pada mulanya, fungsi ini berfungsi pada satu set data menggunakan:

SELECT * FROM foo( (SELECT ARRAY_AGG(data) FROM datatable GROUP BY dataid WHERE dataid = something), 1) 

Walau bagaimanapun, matlamatnya adalah untuk membuat ia berfungsi untuk berbilang kumpulan data tanpa menyatakan parameter dataid.

Satu pendekatan melibatkan penggunaan subkueri untuk mengagregatkan data ke dalam tatasusunan dan kemudian menghantarnya ke fungsi foo:

SELECT dataid, (foo(ARRAY_AGG(data)),1).*
FROM dataset
WHERE dataid = something -- only testing on 1
GROUP BY dataid

Walaupun ini mungkin kelihatan logik, ia mengalami masalah memanggil foo beberapa kali, satu untuk setiap data baris.

Menggunakan Lateral Join untuk Pengoptimuman

Untuk mengoptimumkan pertanyaan ini, PostgreSQl LATERAL JOIN boleh digunakan. Teknik berkuasa ini mencipta produk Cartesian berasaskan baris antara hasil subkueri dan baris jadual lain. Dalam kes ini, subkueri mengagregatkan data ke dalam tatasusunan, dan sambung sisi melaksanakan foo sekali untuk setiap baris dalam tatasusunan terkumpul.

Menggunakan PostgreSQL 9.3 atau lebih baru, pertanyaan berikut mengoptimumkan panggilan berbilang fungsi:

SELECT sub.dataid, f.*
FROM  (
   SELECT dataid, array_agg(data) AS arr
   FROM   dataset
   WHERE  dataid = something
   GROUP  BY 1
   ) sub
LEFT   JOIN LATERAL foo(sub.arr) f ON true;

LEFT JOIN LATERAL memastikan semua baris dari jadual kiri (subquery) dikekalkan, walaupun tiada baris dikembalikan oleh foo. Jika fungsi tidak dapat mengembalikan baris, ini ialah sintaks pilihan.

Untuk fungsi yang sentiasa mengembalikan hasil, sintaks yang dipermudahkan boleh digunakan:

CROSS JOIN LATERAL foo(sub.arr)

atau trengkas yang setara:

, foo(sub.arr)

Seperti yang diserlahkan dalam manual Postgres, menggunakan LATERAL JOIN mengoptimumkan pertanyaan dengan fungsi pengembalian set seperti foo. Teknik ini memproses berbilang kumpulan data dengan cekap tanpa memerlukan penilaian fungsi yang tidak perlu.

Atas ialah kandungan terperinci Bagaimanakah PostgreSQL's LATERAL JOIN Mengoptimumkan Panggilan Berbilang Fungsi pada Argumen Tatasusunan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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