Seperti yang sudah dikomentari @Denis:tidak perlu LATERAL
.Juga, subquery Anda memilih kolom yang salah. Ini berfungsi:
SELECT t1.t1_id, t1.t1_data, t2_ids
FROM t1
LEFT JOIN (
SELECT t1_id, array_agg(t2_id) AS t2_ids
FROM t1_t2_rel
GROUP BY 1
) sub USING (t1_id);
Kinerja dan pengujian
Mengenai pemindaian berurutan berikutnya yang Anda sebutkan:Jika Anda menanyakan seluruh tabel, pemindaian berurutan sering lebih cepat . Tergantung pada versi yang Anda jalankan, perangkat keras Anda, pengaturan dan statistik kardinalitas dan distribusi data Anda. Percobaan dengan selektif WHERE
klausa seperti WHERE t1.t1_id < 1000
atau WHERE t1.t1_id = 1000
dan gabungkan dengan setelan perencana
untuk mempelajari tentang pilihan:
SET enable_seqscan = off;
SET enable_indexscan = off;
Untuk menyetel ulang:
RESET enable_seqscan;
RESET enable_indexscan;
Hanya di sesi lokal Anda, ingat! Jawaban terkait ini di dba.SE
memiliki lebih banyak petunjuk.
Tentu saja, setelan Anda juga mungkin tidak aktif: