sql >> Databasteknik >  >> RDS >> PostgreSQL

PostgreSQL IN-operator med underfrågan dålig prestanda

Det verkar som att jag äntligen har hittat 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 att ha utvecklat @Dukelings idé:

Jag misstänker var id i (1,2,3,4,5,6,7,8,9,10) kan optimeras och där id i (välj ...) inte kan, anledningen är att(1,2) ,3,4,5,6,7,8,9,10) är ett konstant uttryck, medan markeringen inte är det.

och lokalisera dessa i en snabbare frågeplan

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

detta fungerar ännu snabbare än den första frågan i frågan, cirka 1,2 ms, och nu använder den

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

och bitmappsskanningar i planen.



  1. Ändra lösenord med Oracle SQL Developer

  2. 4 funktioner som extraherar mikrosekunder från ett tidsvärde i MariaDB

  3. Hantera e-postbekräftelse under registrering i kolv

  4. Konvertera 'smalldatetime' till 'date' i SQL Server (T-SQL-exempel)