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

PostgreSQL-forespørgsel er langsom, når du bruger NOT IN

get_customer_trans() er ikke en tabel - sandsynligvis en lagret procedure, så forespørgslen er ikke rigtig triviel. Du bliver nødt til at se på, hvad denne lagrede procedure virkelig gør for at forstå, hvorfor den muligvis virker langsomt.

Men uanset opførsel af lagrede procedurer, bør tilføjelse af følgende indeks hjælpe meget:

CREATE INDEX do_not_email_tbl_idx1
    ON do_not_email_tbl(do_not_email_address);

Dette indeks tillader NOT IN forespørgsel for hurtigt at returnere svar. Dog NOT IN er kendt for at have problemer i ældre PostgreSQL-versioner - så sørg for at du kører mindst PostgreSQL 9.1 eller nyere.

OPDATERING . Prøv at ændre din forespørgsel til:

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
)

Denne forespørgsel bruger ikke NOT IN , og burde virke hurtigt. Jeg tror, ​​at i PostgreSQL 9.2 burde denne forespørgsel fungere lige så hurtigt som en med NOT IN dog.



  1. Sådan forbinder du sql-udvikler til XAMPP MYSQL-server

  2. Inner Join tabel med hensyn til en maksimal værdi

  3. Udførelse af en Oracle-lagret procedure i EntityFramework

  4. Hvad skal du kontrollere, hvis PostgreSQL-hukommelsesudnyttelsen er høj