PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Operador PostgreSQL IN com baixo desempenho de subconsulta


Parece que finalmente encontrei uma solução:
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;

Depois de elaborar a ideia de @Dukeling:

Eu suspeito onde id em (1,2,3,4,5,6,7,8,9,10) pode ser otimizado e onde id em (select ...) não pode, a razão é que (1,2 ,3,4,5,6,7,8,9,10) é uma expressão constante, enquanto o select não é.

e localizando-os em um plano de consulta mais 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[]))

isso funciona ainda mais rápido que a primeira consulta na pergunta, cerca de 1,2 ms, e agora usa
Recheck Cond: (id = ANY ($1))
Index Cond: (id = ANY ($1))

e varreduras de bitmap no plano.