Kadang-kadang tugas muncul untuk "merekatkan" seleksi integral dengan data yang sama "dalam kolom" dari array linier dilewatkan sebagai parameter ke dalam query SQL.
Bagaimana kadang-kadang dilakukan:
WITH T1 AS ( SELECT row_number() OVER() rn , unnest v1 FROM unnest('{1,2,3,4}'::integer[]) ) , T2 AS ( SELECT row_number() OVER() rn , unnest v2 FROM unnest('{5,6}'::integer[]) ) SELECT T1.v1 , T2.v2 FROM T1 LEFT JOIN T2 USING(rn);
v1 | v2 ------- 1 | 5 2 | 6 3 | 4 |
Artinya, pertama, masing-masing array "diperluas" ke dalam sampel, diberi nomor, dan kemudian nomor ini digunakan sebagai kunci koneksi CTE ...
[lihat menjelaskan.tensor.ru]DENGAN ORDINALITAS
Lebih dari seperempat dari seluruh waktu dihabiskan untuk beberapa WindowAgg!
Tetapi jika kita menggunakan versi PG tidak lebih rendah dari 9,4, kita
dapat menggunakan DENGAN ORDINALITAS untuk memberi nomor pada hasil SRF apa pun, termasuk yang paling tidak:
WITH T1 AS ( SELECT * FROM unnest('{1,2,3,4}'::integer[]) WITH ORDINALITY T(v1, rn) ) , T2 AS ( SELECT * FROM unnest('{5,6}'::integer[]) WITH ORDINALITY T(v2, rn) ) SELECT T1.v1 , T2.v2 FROM T1 LEFT JOIN T2 USING(rn);
[lihat menjelaskan.tensor.ru] .
Jadi, kami benar-benar menyingkirkan penggunaan fungsi jendela.
Multi-argumen UNNEST
Tapi dari sudut pandang efisiensi, tidak semuanya baik sejauh ini - hampir setengah dari waktu pergi ke Hash Left Join.
Dan penulis jelas melanjutkan dari asumsi bahwa array pertama persis lebih lama - itu sebabnya dia menggunakan LEFT JOIN. Namun anggapan ini tidak selalu benar, dan bisa menimbulkan masalah.
Untuk menyiasatinya, kami akan menggunakan
undest untuk beberapa array pada saat yang sama , yang muncul dari versi yang sama 9.4:
SELECT * FROM unnest( '{1,2,3,4}'::integer[] , '{5,6}'::integer[] ) T(v1, v2);
Akibatnya, hampir tidak ada yang tersisa dari permintaan, dan dari rencana:
Function Scan on t (cost=0.01..1.00 rows=100 width=8) (actual time=0.006..0.007 rows=4 loops=1)
Oleh karena itu, kemungkinan melakukan kesalahan jauh lebih kecil. Ya, dan waktu eksekusi ditingkatkan beberapa kali - dan pada array yang lebih lama efeknya akan semakin terlihat.