Sembra che io abbia finalmente trovato una soluzione:
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;
Dopo aver elaborato l'idea di @Dukeling:
Sospetto dove id in (1,2,3,4,5,6,7,8,9,10) possa essere ottimizzato e dove id in (seleziona ...) non può, il motivo è che (1,2 ,3,4,5,6,7,8,9,10) è un'espressione costante, mentre select non lo è.
e individuandoli in un piano di query più rapido
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[]))
funziona anche più velocemente della prima query nella domanda, circa 1,2 ms, e ora utilizza
Recheck Cond: (id = ANY ($1))
Index Cond: (id = ANY ($1))
e scansioni bitmap nel piano.