sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL:beste manier om kleine subsets van grote tabellen samen te voegen

Zoals je al zei, de enige manier om echt weten is om de uitvoeringsplannen te vergelijken. In feite zou de beste manier zijn om EXPLAIN ANALYZE te gebruiken , zodat het de query daadwerkelijk uitvoert en de resultaten met de schattingen in de uitvoer invoegt, zodat u een idee krijgt van de queryplanner versus de realiteit.

In het algemeen zou ik in een dergelijke situatie echter waarschijnlijk een tijdelijke tabel maken voor client subset en dan JOIN dat aan de orders tafel. U kunt optioneel WITH . gebruiken in plaats daarvan om alles in één zoekopdracht te doen.

Dus zoiets als:

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;

Op deze manier, tmp_clients bevat alleen de New York-clients -- ~5K rijen -- en het is die tabel die wordt toegevoegd aan de tabel met bestellingen.

U kunt ook, om verder te optimaliseren, een index maken op de tijdelijke tabel (op de client-id) en vervolgens ANALYZE het voordat u de JOIN . doet om ervoor te zorgen dat de JOIN puur op de index wordt gedaan. U zou de zoekplannen in elk geval willen controleren om het relatieve verschil te zien (of houd dit in gedachten als de JOIN is niet zo snel als je zou willen).

Reactie op opmerking van @poshest:

Dat klinkt als de tijdelijke tabellen stapelen zich op, wat de geheugenvoetafdruk zou vergroten, en voor een langdurige verbinding lijkt functionaliteit een geheugenlek te zijn.

In dat geval zou het echter geen echt lek zijn, aangezien tijdelijke tabellen zijn gericht op een verbinding. Ze verdwijnen automatisch, maar pas nadat de verbinding is verbroken. U kunt ze echter meteen laten verdwijnen als u er klaar mee bent. Gewoon DROP de tabel zoals je elke andere zou doen als je er klaar mee bent, en ik vermoed dat je de functie een aantal keren kunt aanroepen - op dezelfde verbinding - zonder dezelfde soort monotone geheugenvoetafdruk.



  1. Toegang tot MySQL van MAMP vanuit Terminal

  2. MySQL-probleem bij bijwerken van DATETIME-veld van ISO 8601-indeling

  3. Geavanceerd MySQL alfabetisch sorteren met voorvoegsel?

  4. Hoe verbinding maken met MySQL DB als container in docker?