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

Postgres НЕ Е В изпълнение

Огромен IN списъкът е много неефективен. PostgreSQL в идеалния случай би трябвало да го идентифицира и да го превърне в релация, към която прави анти-съединяване, но в този момент плановщикът на заявките не знае как да направи това и времето за планиране, необходимо за идентифициране на този случай, ще струва всяка заявка, която използва NOT IN разумно, така че проверката трябва да е много евтина. Вижте този по-ранен много по-подробен отговор по темата .

Както Дейвид Олдридж писа, това се решава най-добре, като се превърне в анти-съединяване. Бих го написал като съединение върху VALUES списък просто защото PostgreSQL е изключително бърз при анализиране на VALUES списъци в релации, но ефектът е същият:

SELECT entityid 
FROM entity e
LEFT JOIN level1entity l1 ON l.level1id = e.level1_level1id
LEFT JOIN level2entity l2 ON l2.level2id = l1.level2_level2id
LEFT OUTER JOIN (
    VALUES
    (1377776),(1377792),(1377793),(1377794),(1377795),(1377796)
) ex(ex_entityid) ON (entityid = ex_entityid)
WHERE l2.userid = 'a987c246-65e5-48f6-9d2d-a7bcb6284c8f' 
AND ex_entityid IS NULL; 

За достатъчно голям набор от стойности може дори да е по-добре да създадете временна таблица, COPY вкарвайки стойностите в него, създавайки PRIMARY KEY върху него и присъединяване към него.

Още възможности, разгледани тук:

https://stackoverflow.com/a/17038097/398670



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Не може да се свърже с postgres от отдалечен хост

  2. Как да съхраня pdf файл в база данни postgresql с помощта на сървлети?

  3. настройка на PostgreSQL с Laravel в MAMP

  4. Как да прекъсна RPostgresql заявка в R

  5. ResetDjango postgresql база данни? промиването не работи