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

zoptymalizuj zapytanie w PostgreSQL

Ponowne sformatowanie planu zapytań dla jasności:

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

Dwa indeksy częściowe mogą wyeliminuj seq skany w zależności od dystrybucji danych:

-- 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);

Być może brakuje indeksu w kluczu obcym:

CREATE INDEX plain_contacts_contact_id_idx ON plain_contacts (contact_id);

Na koniec, jeśli nigdy nie analizowałeś swoich danych, musisz uruchomić:

VACUUM ANALYZE;

Jeśli po wykonaniu wszystkich czynności nadal działa wolno, niewiele można zrobić poza połączeniem tabel plain_contacts i kontaktów:otrzymanie powyższego planu zapytań pomimo powyższych indeksów oznacza, że ​​większość/wszyscy subskrybenci subskrybują to konkretna lista - w takim przypadku powyższy plan zapytań jest najszybszy, jaki otrzymasz.



  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 wykonać wiele złączeń z różnymi parametrami w jednym zapytaniu?

  2. Nie można połączyć się z bazą danych Amazon PostgreSQL RDS na R przy użyciu RPostgreSQL

  3. Konstruowanie ciągu z kilku rekordów z 2 kolumnami

  4. Węzeł wywołujący funkcję postgres z tabelami tymczasowymi powodującymi wyciek pamięci

  5. Uzyskiwanie wpisanych wyników z surowego SQL ActiveRecord