PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PostgreSQL-IN-Operator mit schlechter Leistung der Unterabfrage

Scheint, dass ich endlich eine Lösung gefunden habe:

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;

Nach der Ausarbeitung der Idee von @Dukeling:

Ich vermute, wo id in (1,2,3,4,5,6,7,8,9,10) optimiert werden kann und wo id in (select ...) nicht kann, der Grund dafür ist, dass (1,2 ,3,4,5,6,7,8,9,10) ist ein konstanter Ausdruck, die Auswahl dagegen nicht.

und diese in einem schnelleren Abfrageplan zu lokalisieren

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

Dies funktioniert sogar schneller als die erste Abfrage in der Frage, etwa 1,2 ms, und verwendet jetzt

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

und Bitmap-Scans im Plan.