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

PostgreSQL:il modo migliore per unire piccoli sottoinsiemi di grandi tabelle

Come hai accennato, l'unico modo per veramente sapere è confrontare i piani di esecuzione. In effetti, il modo migliore sarebbe usare EXPLAIN ANALYZE , in modo che esegua effettivamente la query e inserisca i risultati nell'output con le stime, in modo che tu possa avere un'idea del pianificatore di query rispetto alla realtà.

Tuttavia, in generale, quello che farei in una situazione come questa sarebbe probabilmente creare una tabella temporanea per il sottoinsieme di client e quindi JOIN che agli orders tavolo. Puoi opzionalmente usare WITH invece di fare tutto in una query.

Quindi, qualcosa come:

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;

In questo modo, tmp_clients contiene solo i clienti di New York -- ~5.000 righe -- ed è quella tabella che verrà unita alla tabella degli ordini.

Potresti anche, per ottimizzare ulteriormente, creare un indice sulla tabella temporanea (sul clientid) e quindi ANALYZE prima di fare il JOIN per garantire che il JOIN avvenga esclusivamente sull'indice. Ti consigliamo di controllare i piani di query in ogni caso per vedere la differenza relativa (o semplicemente tienilo a mente se il JOIN non è così veloce come vorresti).

Risposta al commento di @poshest:

Sembrano le tabelle temporanee si stanno accumulando, il che aumenterebbe il footprint di memoria e, per una connessione di lunga durata, la funzionalità sembra essere una perdita di memoria.

In tal caso, tuttavia, non sarebbe una vera fuga di notizie, come tabelle temporanee sono inclusi nell'ambito di una connessione. Scompaiono automaticamente, ma non fino al termine della connessione. Tuttavia, puoi farli sparire immediatamente quando hai finito con loro. Semplicemente DROP la tabella come faresti con qualsiasi altro una volta che hai finito con loro, e sospetto che sarai in grado di chiamare la funzione un sacco di volte - sulla stessa connessione - senza lo stesso tipo di aumento dell'impronta di memoria monotona.