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

PostgreSQL IN-operator med underforespørgsel dårlig ydeevne

Det ser ud til, at jeg endelig har fundet en løsning:

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;

Efter at have uddybet @Dukelings idé:

Jeg formoder, hvor id i (1,2,3,4,5,6,7,8,9,10) kan optimeres, og hvor id i (vælg ...) ikke kan, grunden er, at(1,2) ,3,4,5,6,7,8,9,10) er et konstant udtryk, mens markeringen ikke er det.

og lokalisering af disse i en hurtigere forespørgselsplan

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

dette virker endnu hurtigere end den første forespørgsel i spørgsmålet, ca. 1,2 ms, og nu bruger den

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

og bitmap-scanninger i planen.



  1. Hvordan overføres tabelværdiparametre fra Java til sql server lagret procedure?

  2. Få feltværdien med en markør

  3. Hvordan fjerner man nye linjetegn fra datarækker i mysql?

  4. Del store sletningsoperationer op i bidder