sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL IN-operator met slechte prestaties van subquery

Het lijkt erop dat ik eindelijk een oplossing heb gevonden:

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;

Na het idee van @Dukeling te hebben uitgewerkt:

Ik vermoed waar id in (1,2,3,4,5,6,7,8,9,10) kan worden geoptimaliseerd en waar id in (selecteer ...) niet kan, omdat (1,2 ,3,4,5,6,7,8,9,10) is een constante uitdrukking, terwijl de select dat niet is.

en deze te lokaliseren in een sneller zoekplan

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

dit werkt zelfs sneller dan de eerste query in de vraag, ongeveer 1,2 ms, en nu gebruikt het

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

en bitmapscans in het plan.



  1. Kan niet decoderen met pgcrypto van AES-256-CBC, maar AES-128-CBC is OK

  2. psql ongeldige opdracht \N while restore sql

  3. Hoe te controleren of PostgreSQL-array waarde bevat?

  4. Het minimum van twee waarden in SQL verkrijgen