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

оптимизирайте заявката в PostgreSQL

Преформатиране на вашия план за заявка за яснота:

QUERY PLAN Aggregate (cost=126377.96..126377.97 rows=1 width=0)
  -> Hash Join (cost=6014.51..126225.38 rows=61033 width=0)
     Hash Cond: (contacts_lists.contact_id = plain_contacts.contact_id)
    -> Hash Join (cost=3067.30..121828.63 rows=61033 width=8)
       Hash Cond: (contacts_lists.contact_id = contacts.id)
      -> Index Scan using index_contacts_lists_on_list_id_and_contact_id
         on contacts_lists (cost=0.00..116909.97 rows=61033 width=4)
         Index Cond: (list_id = 66996)
         -> Hash (cost=1721.41..1721.41 rows=84551 width=4)
         -> Seq Scan on contacts (cost=0.00..1721.41 rows=84551 width=4)
            Filter: ((NOT email_bad) AND (NOT email_unsub))
            -> Hash (cost=2474.97..2474.97 rows=37779 width=4)
            -> Seq Scan on plain_contacts (cost=0.00..2474.97 rows=37779 width=4)
               Filter: has_email

Два частични индекса може елиминирайте сканирането на seq в зависимост от разпространението на вашите данни:

-- if many contacts have bad emails or are unsubscribed:
CREATE INDEX contacts_valid_email_idx ON contacts (id)
WHERE (NOT email_bad AND NOT email_unsub);

-- if many contacts have no email:
CREATE INDEX plain_contacts_valid_email_idx ON plain_contacts (id)
WHERE (has_email);

Възможно е да ви липсва индекс на външен ключ:

CREATE INDEX plain_contacts_contact_id_idx ON plain_contacts (contact_id);

Не на последно място, ако никога не сте анализирали данните си, трябва да стартирате:

VACUUM ANALYZE;

Ако все още е бавно, след като всичко това е направено, няма много какво да направите, освен да обедините вашите plain_contacts и вашите таблици с контакти:получаването на горния план за заявка въпреки горните индекси означава, че повечето/всичките ви абонати са абонирани за това конкретен списък -- в който случай горният план за заявка е най-бързият, който ще получите.



  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. Стартирането на хибернация е много бавно

  3. Включване на LOOP в SQL

  4. PostgreSQL външен ключ не съществува, проблем с наследяването?

  5. Как да използвате SQL прозоречна функция за изчисляване на процент от агрегат