PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Operator IN PostgreSQL ze słabą wydajnością podzapytania

Wygląda na to, że w końcu znalazłem rozwiązanie:

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 opracowaniu pomysłu @Dukelinga:

Podejrzewam, gdzie id w (1,2,3,4,5,6,7,8,9,10) może być zoptymalizowany, a gdzie id w (wybierz ...) nie może, ponieważ (1,2 ,3,4,5,6,7,8,9,10) jest wyrażeniem stałym, podczas gdy select nie jest.

i zlokalizowanie ich w szybszym planie zapytań

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

działa to nawet szybciej niż pierwsze zapytanie w pytaniu, około 1,2 ms, a teraz używa

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

i skany bitmap w planie.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak EDB stał się liderem na rynku Postgres

  2. Dodanie nowej wartości do istniejącego typu ENUM

  3. BŁĄD:miejsca relacji nie istnieją Heroku db import

  4. Mechanizmy replikacji fizycznej w PostgreSQL

  5. Maksymalna (użyteczna) liczba wierszy w tabeli Postgresql