PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Die PostgreSQL-Abfrage ist langsam, wenn NOT IN verwendet wird

get_customer_trans() ist keine Tabelle - wahrscheinlich eine gespeicherte Prozedur, daher ist die Abfrage nicht wirklich trivial. Sie müssen sich ansehen, was diese gespeicherte Prozedur wirklich tut, um zu verstehen, warum sie möglicherweise langsam arbeitet.

Unabhängig vom Verhalten der gespeicherten Prozedur sollte das Hinzufügen des folgenden Index jedoch sehr hilfreich sein:

CREATE INDEX do_not_email_tbl_idx1
    ON do_not_email_tbl(do_not_email_address);

Dieser Index lässt NOT IN zu Abfrage, um schnell eine Antwort zurückzugeben. Jedoch NOT IN hat bekanntermaßen Probleme mit älteren PostgreSQL-Versionen - stellen Sie also sicher, dass Sie mindestens PostgreSQL 9.1 oder höher ausführen.

AKTUALISIEREN . Versuchen Sie, Ihre Abfrage zu ändern 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
)

Diese Abfrage verwendet NOT IN nicht , und sollte schnell funktionieren. Ich denke, dass diese Abfrage in PostgreSQL 9.2 so schnell funktionieren sollte wie eine mit NOT IN obwohl.