get_customer_trans()
er ikke en tabel - sandsynligvis en lagret procedure, så forespørgslen er ikke rigtig triviel. Du bliver nødt til at se på, hvad denne lagrede procedure virkelig gør for at forstå, hvorfor den muligvis virker langsomt.
Men uanset opførsel af lagrede procedurer, bør tilføjelse af følgende indeks hjælpe meget:
CREATE INDEX do_not_email_tbl_idx1
ON do_not_email_tbl(do_not_email_address);
Dette indeks tillader NOT IN
forespørgsel for hurtigt at returnere svar. Dog NOT IN
er kendt for at have problemer i ældre PostgreSQL-versioner - så sørg for at du kører mindst PostgreSQL 9.1 eller nyere.
OPDATERING . Prøv at ændre din forespørgsel til:
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
)
Denne forespørgsel bruger ikke NOT IN
, og burde virke hurtigt. Jeg tror, at i PostgreSQL 9.2 burde denne forespørgsel fungere lige så hurtigt som en med NOT IN
dog.