PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

La query PostgreSQL è lenta quando si utilizza NOT IN

get_customer_trans() non è una tabella, probabilmente una procedura memorizzata, quindi la query non è davvero banale. Dovresti guardare cosa fa davvero questa procedura memorizzata per capire perché potrebbe funzionare lentamente.

Tuttavia, indipendentemente dal comportamento della stored procedure, l'aggiunta del seguente indice dovrebbe aiutare molto:

CREATE INDEX do_not_email_tbl_idx1
    ON do_not_email_tbl(do_not_email_address);

Questo indice consente di NOT IN query per restituire rapidamente la risposta. Tuttavia, NOT IN è noto che presenta problemi nelle versioni precedenti di PostgreSQL, quindi assicurati di eseguire almeno PostgreSQL 9.1 o versioni successive.

AGGIORNAMENTO . Prova a cambiare la tua query 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
)

Questa query non utilizza NOT IN , e dovrebbe funzionare velocemente. Penso che in PostgreSQL 9.2 questa query dovrebbe funzionare alla stessa velocità di una con NOT IN però.