sql >> Base de Datos >  >> RDS >> PostgreSQL

Operador PostgreSQL IN con bajo rendimiento de subconsulta

Parece que finalmente he encontrado una solución:

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;

Después de elaborar la idea de @Dukeling:

Sospecho dónde se puede optimizar la identificación en (1,2,3,4,5,6,7,8,9,10) y dónde no se puede optimizar la identificación en (seleccionar ...), la razón es que (1,2 ,3,4,5,6,7,8,9,10) es una expresión constante, mientras que la selección no lo es.

y ubicarlos en un plan de consulta más 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[]))

esto funciona incluso más rápido que la primera consulta de la pregunta, alrededor de 1,2 ms, y ahora usa

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

y escaneos de mapa de bits en el plan.