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.