get_customer_trans()
не е таблица - вероятно някаква съхранена процедура, така че заявката не е наистина тривиална. Трябва да погледнете какво наистина прави тази съхранена процедура, за да разберете защо може да работи бавно.
Въпреки това, независимо от поведението на съхранената процедура, добавянето на следния индекс трябва да помогне много:
CREATE INDEX do_not_email_tbl_idx1
ON do_not_email_tbl(do_not_email_address);
Този индекс позволява NOT IN
заявка за бързо връщане на отговор. Въпреки това NOT IN
е известно, че има проблеми в по-старите версии на PostgreSQL - затова се уверете, че използвате поне PostgreSQL 9.1 или по-нова версия.
АКТУАЛИЗАЦИЯ . Опитайте да промените заявката си на:
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
)
Тази заявка не използва NOT IN
, и трябва да работи бързо. Мисля, че в PostgreSQL 9.2 тази заявка трябва да работи толкова бързо, колкото тази с NOT IN
въпреки това.