Rumah >pangkalan data >tutorial mysql >Bagaimanakah PostgreSQL's LATERAL JOIN Mengoptimumkan Panggilan Berbilang Fungsi pada Argumen Tatasusunan?
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!