get_customer_trans()
není tabulka - pravděpodobně nějaká uložená procedura, takže dotaz není opravdu triviální. Budete se muset podívat na to, co tato uložená procedura skutečně dělá, abyste pochopili, proč může fungovat pomalu.
Bez ohledu na chování uložené procedury by však přidání následujícího indexu mělo hodně pomoci:
CREATE INDEX do_not_email_tbl_idx1
ON do_not_email_tbl(do_not_email_address);
Tento index umožňuje NOT IN
dotaz pro rychlé vrácení odpovědi. Nicméně NOT IN
je známo, že má problémy se staršími verzemi PostgreSQL - takže se ujistěte, že používáte PostgreSQL alespoň 9.1 nebo novější.
AKTUALIZACE . Zkuste změnit svůj dotaz 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
)
Tento dotaz nepoužívá NOT IN
, a měl by fungovat rychle. Myslím, že v PostgreSQL 9.2 by tento dotaz měl fungovat stejně rychle jako dotaz s NOT IN
ačkoli.