Както @Denis вече коментира:няма нужда от LATERAL
.Освен това вашата подзаявка е избрала грешната колона. Това работи:
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);
Ефективност и тестване
Относно последващото последователно сканиране, което споменахте:Ако направите запитване до цялата таблица, последователното сканиране често е по-бързо . Зависи от версията, която използвате, вашия хардуер, вашите настройки и статистики за мощности и разпределение на вашите данни. Експериментирайте със селективно WHERE
клаузи като WHERE t1.t1_id < 1000
или WHERE t1.t1_id = 1000
и комбинирайте с настройки за планиране
за да научите за възможностите за избор:
SET enable_seqscan = off;
SET enable_indexscan = off;
За нулиране:
RESET enable_seqscan;
RESET enable_indexscan;
Само във вашата местна сесия, имайте предвид! Този свързан отговор на dba.SE
има още инструкции.
Разбира се, вашата настройка също може да е изключена: