sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL-query is traag bij gebruik van NOT IN

get_customer_trans() is geen tabel - waarschijnlijk een opgeslagen procedure, dus een query is niet echt triviaal. Je zou moeten kijken naar wat deze opgeslagen procedure werkelijk doet om te begrijpen waarom het traag zou kunnen werken.

Ongeacht het gedrag van de opgeslagen procedure, zou het toevoegen van de volgende index veel moeten helpen:

CREATE INDEX do_not_email_tbl_idx1
    ON do_not_email_tbl(do_not_email_address);

Deze index laat NOT IN vraag om snel antwoord te geven. Echter, NOT IN staat bekend om problemen in oudere PostgreSQL-versies - zorg er dus voor dat u ten minste PostgreSQL 9.1 of hoger gebruikt.

UPDATE . Probeer uw zoekopdracht te wijzigen in:

SELECT t.*
FROM get_customer_trans() AS t
WHERE NOT EXISTS (
    SELECT 1
    FROM do_not_email_tbl
    WHERE do_not_email_address = t.user_email
    LIMIT 1
)

Deze zoekopdracht maakt geen gebruik van NOT IN , en zou snel moeten werken. Ik denk dat in PostgreSQL 9.2 deze query net zo snel zou moeten werken als een met NOT IN hoewel.



  1. SQL herstellen vanuit meerdere SQL-bestanden

  2. ORA-04068:bestaande staat van pakketten is verwijderd ORA-04065:niet uitgevoerd, gewijzigd of verwijderd opgeslagen procedure

  3. Waarom geeft deze in MySQL opgeslagen functie andere resultaten dan de berekening in de query?

  4. Hoe de gegevens voor reacties met threads (samen met stemmen op reacties) in mongodb weer te geven?