Il semble que j'ai enfin trouvé une solution :
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;
Après avoir développé l'idée de @Dukeling :
Je soupçonne où id in (1,2,3,4,5,6,7,8,9,10) peut être optimisé et où id in (select ...) ne peut pas, la raison étant que (1,2 ,3,4,5,6,7,8,9,10) est une expression constante, alors que select ne l'est pas.
et les localiser dans un plan de requête plus rapide
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[]))
cela fonctionne encore plus rapidement que la première requête de la question, environ 1,2 ms, et maintenant elle utilise
Recheck Cond: (id = ANY ($1))
Index Cond: (id = ANY ($1))
et des numérisations bitmap dans le plan.