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

PostgreSQL:bedste måde at forbinde små undergrupper af store tabeller på

Som du hentydede til, er den eneste måde at virkelig på ved er at sammenligne udførelsesplanerne. Faktisk ville den bedste måde være at bruge EXPLAIN ANALYZE , så den rent faktisk udfører forespørgslen og indsætter resultaterne i output med estimaterne, så du kan få en fornemmelse af forespørgselsplanlæggeren kontra virkeligheden.

Men generelt, hvad jeg ville gøre i en situation som denne ville sandsynligvis være at oprette en temp-tabel for klientundersæt og derefter JOIN det til orders bord. Du kan eventuelt bruge WITH i stedet for at gøre alt i én forespørgsel.

Altså noget som:

CREATE TEMP TABLE tmp_clients AS
SELECT c.clientid
FROM clients c
WHERE c.city = 'New York'
ORDER BY c.clientid;

SELECT *
FROM orders AS o
JOIN tmp_clients AS c ON (o.clientid = c.clientid)
ORDER BY o.clientid;

På denne måde, tmp_clients indeholder kun New York-klienter -- ~5.000 rækker -- og det er den tabel, der vil blive knyttet til ordretabellen.

Du kan også, for at optimere yderligere, oprette et indeks på temp-tabellen (på klient-id'et) og derefter ANALYZE det, før du udfører JOIN for at sikre, at JOIN sker udelukkende på indekset. Du vil gerne kontrollere forespørgselsplanerne i hvert enkelt tilfælde for at se den relative forskel (eller bare huske på dette, hvis JOIN er ikke helt så hurtig, som du ønsker).

Svar på kommentar fra @poshest:

Det lyder som temp-tabellerne stables op, hvilket ville øge hukommelsesfodaftrykket, og for en langvarig forbindelse ser funktionalitet ud til at være en hukommelseslækage.

I så fald ville det dog ikke være en sand lækage som temp-tabeller er omfattet af en forbindelse. De forsvinder automatisk, men først efter forbindelsen er afsluttet. Du kan dog få dem til at forsvinde med det samme, når du er færdig med dem. Simpelthen DROP bordet, som du ville gøre med enhver anden, når du er færdig med dem, og jeg formoder, at du vil være i stand til at kalde funktionen en masse gange -- på den samme forbindelse -- uden den samme form for monotone stigning i hukommelsen.



  1. Oracle SQL :sorter række med afgrænset streng

  2. Tæl antallet af forskellige rækker for flere værdier

  3. Forslag til sikkerhedskopiering af php site og mysql db

  4. Hvordan forbinder jeg en mysql-databasefil til en lokal ruby ​​on rails-applikation