get_customer_trans()
non è una tabella, probabilmente una procedura memorizzata, quindi la query non è davvero banale. Dovresti guardare cosa fa davvero questa procedura memorizzata per capire perché potrebbe funzionare lentamente.
Tuttavia, indipendentemente dal comportamento della stored procedure, l'aggiunta del seguente indice dovrebbe aiutare molto:
CREATE INDEX do_not_email_tbl_idx1
ON do_not_email_tbl(do_not_email_address);
Questo indice consente di NOT IN
query per restituire rapidamente la risposta. Tuttavia, NOT IN
è noto che presenta problemi nelle versioni precedenti di PostgreSQL, quindi assicurati di eseguire almeno PostgreSQL 9.1 o versioni successive.
AGGIORNAMENTO . Prova a cambiare la tua query in:
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
)
Questa query non utilizza NOT IN
, e dovrebbe funzionare velocemente. Penso che in PostgreSQL 9.2 questa query dovrebbe funzionare alla stessa velocità di una con NOT IN
però.