PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

A consulta do PostgreSQL é lenta ao usar NOT IN


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.