sql >> Databáze >  >> RDS >> PostgreSQL

Operátor PostgreSQL IN se slabým výkonem poddotazu

Zdá se, že jsem konečně našel řešení:

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;

Po rozpracování nápadu @Dukeling:

Mám podezření, že kde id v (1,2,3,4,5,6,7,8,9,10) lze optimalizovat a kde id v (select ...) nelze, důvodem je, že (1,2 ,3,4,5,6,7,8,9,10) je konstantní výraz, zatímco výběr nikoli.

a jejich umístění v rychlejším plánu dotazů

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

funguje to ještě rychleji než první dotaz v otázce, asi 1,2 ms, a teď to používá

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

a rastrové skeny v plánu.



  1. Moje databáze MySQL je poškozená... Co teď mám dělat?

  2. Metoda shromažďování:Procedura EXTEND v databázi Oracle

  3. Jaký je nejlepší způsob, jak se vypořádat s DBNull's

  4. Jak používat EXECUTE FORMAT ... POUŽÍVÁNÍ ve funkci postgres