Het lijkt erop dat ik eindelijk een oplossing heb gevonden:
select *
from view1
where view1.id = ANY(
(select array(select ext_id
from aggregate_table
order by somedata limit 10)
)::integer[]
)
order by view1.somedata;
Na het idee van @Dukeling te hebben uitgewerkt:
Ik vermoed waar id in (1,2,3,4,5,6,7,8,9,10) kan worden geoptimaliseerd en waar id in (selecteer ...) niet kan, omdat (1,2 ,3,4,5,6,7,8,9,10) is een constante uitdrukking, terwijl de select dat niet is.
en deze te lokaliseren in een sneller zoekplan
Recheck Cond: (id = ANY ('{1,2,3,4,5,6,7,8,9,10}'::integer[]))
Index Cond: (id = ANY ('{1,2,3,4,5,6,7,8,9,10}'::integer[]))
dit werkt zelfs sneller dan de eerste query in de vraag, ongeveer 1,2 ms, en nu gebruikt het
Recheck Cond: (id = ANY ($1))
Index Cond: (id = ANY ($1))
en bitmapscans in het plan.