sql >> Database >  >> RDS >> PostgreSQL

optimaliseer Query in PostgreSQL

Uw queryplan opnieuw opmaken voor de duidelijkheid:

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

Twee gedeeltelijke indexen misschien seq scans elimineren, afhankelijk van uw gegevensdistributie:

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

Mogelijk mist u een index op een externe sleutel:

CREATE INDEX plain_contacts_contact_id_idx ON plain_contacts (contact_id);

Last but not least, als u uw gegevens nog nooit hebt geanalyseerd, moet u het volgende uitvoeren:

VACUUM ANALYZE;

Als het nog steeds traag is als dat allemaal is gedaan, kun je niet veel doen behalve het samenvoegen van je plain_contacts en je contactentabellen:als je het bovenstaande queryplan krijgt ondanks de bovenstaande indexen, zijn de meeste / al je abonnees daarop geabonneerd bepaalde lijst -- in dat geval is het bovenstaande zoekplan de snelste die u kunt krijgen.



  1. Hoe verwerkt Oracle opgeslagen functieaanroepen in SQL?

  2. ER_ACCESS_DENIED_ERROR:wanneer ik probeer verbinding te maken met de database op een externe server - Node.js

  3. Hoe Oracle MD5 hash-functie aan te roepen?

  4. Ondersteunt PLV8 het maken van http-aanroepen naar andere servers?