Изглежда, че най-накрая намерих решение:
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;
След разработване на идеята на @Dukeling:
Подозирам къде идентификаторът в (1,2,3,4,5,6,7,8,9,10) може да бъде оптимизиран и където идентификаторът в (изберете ...) не може, причината е, че (1,2 ,3,4,5,6,7,8,9,10) е константен израз, докато избраният не е.
и намирането им в план за по-бърза заявка
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[]))
това работи дори по-бързо от първата заявка във въпроса, около 1,2 мс, и сега използва
Recheck Cond: (id = ANY ($1))
Index Cond: (id = ANY ($1))
и растерни сканирания в плана.