PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

PostgreSQL IN оператор с слаба производителност на подзаявката

Изглежда, че най-накрая намерих решение:

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;

След разработване на идеята на @Dukeling:

Подозирам къде идентификаторът в (1,2,3,4,5,6,7,8,9,10) може да бъде оптимизиран и където идентификаторът в (изберете ...) не може, причината е, че (1,2 ,3,4,5,6,7,8,9,10) е константен израз, докато избраният не е.

и намирането им в план за по-бърза заявка

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

това работи дори по-бързо от първата заявка във въпроса, около 1,2 мс, и сега използва

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

и растерни сканирания в плана.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Прехвърляне на данни между бази данни с PostgreSQL

  2. Как да разберем ОБЯСНИТЕЛЕН АНАЛИЗ

  3. Вземете идентификатора на последното вмъкване след подготвено вмъкване с PDO

  4. Как да промените потребител на суперпотребител в PostgreSQL

  5. Компресиране на текст в PostgreSQL