get_customer_trans()
är inte en tabell - förmodligen någon lagrad procedur, så frågan är egentligen inte trivial. Du måste titta på vad den här lagrade proceduren verkligen gör för att förstå varför den kan fungera långsamt.
Men oavsett hur lagrad procedur fungerar bör det hjälpa mycket att lägga till följande index:
CREATE INDEX do_not_email_tbl_idx1
ON do_not_email_tbl(do_not_email_address);
Detta index tillåter NOT IN
fråga för att snabbt returnera svar. Men NOT IN
är känt för att ha problem i äldre PostgreSQL-versioner - så se till att du kör minst PostgreSQL 9.1 eller senare.
UPPDATERA . Försök att ändra din fråga till:
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
)
Den här frågan använder inte NOT IN
, och bör fungera snabbt. Jag tror att i PostgreSQL 9.2 borde denna fråga fungera lika snabbt som en med NOT IN
dock.