Wygląda na to, że w końcu znalazłem rozwiązanie:
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 opracowaniu pomysłu @Dukelinga:
Podejrzewam, gdzie id w (1,2,3,4,5,6,7,8,9,10) może być zoptymalizowany, a gdzie id w (wybierz ...) nie może, ponieważ (1,2 ,3,4,5,6,7,8,9,10) jest wyrażeniem stałym, podczas gdy select nie jest.
i zlokalizowanie ich w szybszym planie zapytań
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[]))
działa to nawet szybciej niż pierwsze zapytanie w pytaniu, około 1,2 ms, a teraz używa
Recheck Cond: (id = ANY ($1))
Index Cond: (id = ANY ($1))
i skany bitmap w planie.