get_customer_trans()
n'est pas une table - probablement une procédure stockée, donc la requête n'est pas vraiment triviale. Vous devez examiner ce que fait réellement cette procédure stockée pour comprendre pourquoi elle peut fonctionner lentement.
Cependant, quel que soit le comportement de la procédure stockée, l'ajout de l'index suivant devrait beaucoup aider :
CREATE INDEX do_not_email_tbl_idx1
ON do_not_email_tbl(do_not_email_address);
Cet index laisse NOT IN
question pour retourner rapidement la réponse. Cependant, NOT IN
est connu pour avoir des problèmes dans les anciennes versions de PostgreSQL - assurez-vous donc que vous exécutez au moins PostgreSQL 9.1 ou une version ultérieure.
MISE À JOUR . Essayez de modifier votre requête en :
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
)
Cette requête n'utilise pas NOT IN
, et devrait fonctionner rapidement. Je pense que dans PostgreSQL 9.2, cette requête devrait fonctionner aussi rapidement qu'une requête avec NOT IN
cependant.