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.