PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Operatore PostgreSQL IN con prestazioni scadenti della sottoquery

Sembra che io abbia finalmente trovato una soluzione:

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;

Dopo aver elaborato l'idea di @Dukeling:

Sospetto dove id in (1,2,3,4,5,6,7,8,9,10) possa essere ottimizzato e dove id in (seleziona ...) non può, il motivo è che (1,2 ,3,4,5,6,7,8,9,10) è un'espressione costante, mentre select non lo è.

e individuandoli in un piano di query più rapido

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

funziona anche più velocemente della prima query nella domanda, circa 1,2 ms, e ora utilizza

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

e scansioni bitmap nel piano.