sql >> Databáze >  >> RDS >> PostgreSQL

PostgreSQL dotaz je pomalý při použití NOT IN

get_customer_trans() není tabulka - pravděpodobně nějaká uložená procedura, takže dotaz není opravdu triviální. Budete se muset podívat na to, co tato uložená procedura skutečně dělá, abyste pochopili, proč může fungovat pomalu.

Bez ohledu na chování uložené procedury by však přidání následujícího indexu mělo hodně pomoci:

CREATE INDEX do_not_email_tbl_idx1
    ON do_not_email_tbl(do_not_email_address);

Tento index umožňuje NOT IN dotaz pro rychlé vrácení odpovědi. Nicméně NOT IN je známo, že má problémy se staršími verzemi PostgreSQL - takže se ujistěte, že používáte PostgreSQL alespoň 9.1 nebo novější.

AKTUALIZACE . Zkuste změnit svůj dotaz na:

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
)

Tento dotaz nepoužívá NOT IN , a měl by fungovat rychle. Myslím, že v PostgreSQL 9.2 by tento dotaz měl fungovat stejně rychle jako dotaz s NOT IN ačkoli.



  1. Portování procedury Oracle na PostgreSQL

  2. Odstraňte duplikáty v dotazu MySQL JOIN na JSON_ARRAYAGG pomocí INNER JOIN

  3. Jak by filtrované indexy mohly být výkonnější funkcí

  4. Jak vložit prvky pole do SQL propojeného s c++?