get_customer_trans()
nie jest tabelą - prawdopodobnie jakaś procedura składowana, więc zapytanie nie jest tak naprawdę trywialne. Musisz sprawdzić, co naprawdę robi ta procedura składowana, aby zrozumieć, dlaczego może działać wolno.
Jednak niezależnie od zachowania procedury składowanej dodanie następującego indeksu powinno bardzo pomóc:
CREATE INDEX do_not_email_tbl_idx1
ON do_not_email_tbl(do_not_email_address);
Ten indeks pozwala NOT IN
zapytanie, aby szybko zwrócić odpowiedź. Jednak NOT IN
wiadomo, że mają problemy ze starszymi wersjami PostgreSQL - więc upewnij się, że używasz co najmniej PostgreSQL 9.1 lub nowszego.
AKTUALIZUJ . Spróbuj zmienić zapytanie na:
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
)
To zapytanie nie używa NOT IN
, i powinno działać szybko. Myślę, że w PostgreSQL 9.2 to zapytanie powinno działać tak szybko, jak to z NOT IN
chociaż.