Scheint, dass ich endlich eine Lösung gefunden habe:
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;
Nach der Ausarbeitung der Idee von @Dukeling:
Ich vermute, wo id in (1,2,3,4,5,6,7,8,9,10) optimiert werden kann und wo id in (select ...) nicht kann, der Grund dafür ist, dass (1,2 ,3,4,5,6,7,8,9,10) ist ein konstanter Ausdruck, die Auswahl dagegen nicht.
und diese in einem schnelleren Abfrageplan zu lokalisieren
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[]))
Dies funktioniert sogar schneller als die erste Abfrage in der Frage, etwa 1,2 ms, und verwendet jetzt
Recheck Cond: (id = ANY ($1))
Index Cond: (id = ANY ($1))
und Bitmap-Scans im Plan.