sql >> Base de Datos >  >> RDS >> PostgreSQL

La consulta de PostgreSQL es lenta cuando se usa NOT IN

get_customer_trans() no es una tabla, probablemente algún procedimiento almacenado, por lo que la consulta no es realmente trivial. Debería ver qué hace realmente este procedimiento almacenado para comprender por qué podría funcionar lento.

Sin embargo, independientemente del comportamiento del procedimiento almacenado, agregar el siguiente índice debería ayudar mucho:

CREATE INDEX do_not_email_tbl_idx1
    ON do_not_email_tbl(do_not_email_address);

Este índice permite NOT IN consulta para devolver rápidamente la respuesta. Sin embargo, NOT IN se sabe que tiene problemas en versiones anteriores de PostgreSQL, así que asegúrese de estar ejecutando al menos PostgreSQL 9.1 o posterior.

ACTUALIZAR . Intente cambiar su consulta a:

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 no utiliza NOT IN , y debería funcionar rápido. Creo que en PostgreSQL 9.2 esta consulta debería funcionar tan rápido como una con NOT IN aunque.