PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Opérateur PostgreSQL IN avec sous-requête aux performances médiocres

Il semble que j'ai enfin trouvé une solution :

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;

Après avoir développé l'idée de @Dukeling :

Je soupçonne où id in (1,2,3,4,5,6,7,8,9,10) peut être optimisé et où id in (select ...) ne peut pas, la raison étant que (1,2 ,3,4,5,6,7,8,9,10) est une expression constante, alors que select ne l'est pas.

et les localiser dans un plan de requête plus rapide

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[]))

cela fonctionne encore plus rapidement que la première requête de la question, environ 1,2 ms, et maintenant elle utilise

Recheck Cond: (id = ANY ($1))
Index Cond: (id = ANY ($1))

et des numérisations bitmap dans le plan.