Zdá se, že jsem konečně našel řešení:
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;
Po rozpracování nápadu @Dukeling:
Mám podezření, že kde id v (1,2,3,4,5,6,7,8,9,10) lze optimalizovat a kde id v (select ...) nelze, důvodem je, že (1,2 ,3,4,5,6,7,8,9,10) je konstantní výraz, zatímco výběr nikoli.
a jejich umístění v rychlejším plánu dotazů
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[]))
funguje to ještě rychleji než první dotaz v otázce, asi 1,2 ms, a teď to používá
Recheck Cond: (id = ANY ($1))
Index Cond: (id = ANY ($1))
a rastrové skeny v plánu.