Có vẻ như cuối cùng tôi đã tìm ra giải pháp:
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;
Sau khi xây dựng ý tưởng của @ Dukeling:
Tôi nghi ngờ nơi id trong (1,2,3,4,5,6,7,8,9,10) có thể được tối ưu hóa và nơi id trong (select ...) không thể, lý do là (1,2 , 3,4,5,6,7,8,9,10) là một biểu thức hằng, trong khi select is not.
và định vị chúng trong kế hoạch truy vấn nhanh hơn
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[]))
điều này thậm chí còn hoạt động nhanh hơn truy vấn đầu tiên trong câu hỏi, khoảng 1,2 mili giây và bây giờ nó sử dụng
Recheck Cond: (id = ANY ($1))
Index Cond: (id = ANY ($1))
và quét bitmap trong kế hoạch.