sql >> Databasteknik >  >> RDS >> PostgreSQL

PostgreSQL-frågan är långsam när du använder NOT IN

get_customer_trans() är inte en tabell - förmodligen någon lagrad procedur, så frågan är egentligen inte trivial. Du måste titta på vad den här lagrade proceduren verkligen gör för att förstå varför den kan fungera långsamt.

Men oavsett hur lagrad procedur fungerar bör det hjälpa mycket att lägga till följande index:

CREATE INDEX do_not_email_tbl_idx1
    ON do_not_email_tbl(do_not_email_address);

Detta index tillåter NOT IN fråga för att snabbt returnera svar. Men NOT IN är känt för att ha problem i äldre PostgreSQL-versioner - så se till att du kör minst PostgreSQL 9.1 eller senare.

UPPDATERA . Försök att ändra din fråga till:

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
)

Den här frågan använder inte NOT IN , och bör fungera snabbt. Jag tror att i PostgreSQL 9.2 borde denna fråga fungera lika snabbt som en med NOT IN dock.



  1. Fullständig yttre sammanfogning på tre bord

  2. Infogar data för att spela in i sqlite

  3. EF Core GroupBy med Select Distinct Count

  4. Mysql partitionering och joins