get_customer_trans()
não é uma tabela - provavelmente algum procedimento armazenado, portanto, a consulta não é realmente trivial. Você precisaria ver o que esse procedimento armazenado realmente faz para entender por que ele pode funcionar devagar. No entanto, independentemente do comportamento do procedimento armazenado, adicionar o seguinte índice deve ajudar muito:
CREATE INDEX do_not_email_tbl_idx1
ON do_not_email_tbl(do_not_email_address);
Este índice permite
NOT IN
consulta para retornar rapidamente a resposta. No entanto, NOT IN
é conhecido por ter problemas em versões mais antigas do PostgreSQL - portanto, certifique-se de estar executando pelo menos o PostgreSQL 9.1 ou posterior. ATUALIZAÇÃO . Tente alterar sua consulta para:
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
)
Esta consulta não usa
NOT IN
, e deve funcionar rápido. Acho que no PostgreSQL 9.2 esta consulta deve funcionar tão rápido quanto uma com NOT IN
no entanto.