Parece que finalmente he encontrado una solución:
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;
Después de elaborar la idea de @Dukeling:
Sospecho dónde se puede optimizar la identificación en (1,2,3,4,5,6,7,8,9,10) y dónde no se puede optimizar la identificación en (seleccionar ...), la razón es que (1,2 ,3,4,5,6,7,8,9,10) es una expresión constante, mientras que la selección no lo es.
y ubicarlos en un plan de consulta más rápido
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[]))
esto funciona incluso más rápido que la primera consulta de la pregunta, alrededor de 1,2 ms, y ahora usa
Recheck Cond: (id = ANY ($1))
Index Cond: (id = ANY ($1))
y escaneos de mapa de bits en el plan.