PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

La requête PostgreSQL est lente lors de l'utilisation de NOT IN

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.