PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PostgreSQL:beste Möglichkeit, kleine Teilmengen großer Tabellen zu verknüpfen

Wie Sie bereits angedeutet haben, ist dies der einzige Weg, wirklich zu sein wissen ist, die Ausführungspläne zu vergleichen. Tatsächlich wäre der beste Weg, EXPLAIN ANALYZE zu verwenden , sodass die Abfrage tatsächlich ausgeführt und die Ergebnisse zusammen mit den Schätzungen in die Ausgabe eingefügt werden, sodass Sie ein Gefühl für den Abfrageplaner im Vergleich zur Realität bekommen.

Im Allgemeinen würde ich in einer solchen Situation jedoch wahrscheinlich eine temp-Tabelle erstellen für Client-Teilmenge und dann JOIN das zu den orders Tisch. Sie können optional WITH verwenden stattdessen alles in einer Abfrage erledigen.

Also so etwas wie:

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;

Auf diese Weise tmp_clients enthält nur die New Yorker Kunden – ~5.000 Zeilen – und es ist diese Tabelle, die mit der Auftragstabelle verknüpft wird.

Sie könnten zur weiteren Optimierung auch einen Index für die temporäre Tabelle (auf der Client-ID) erstellen und dann ANALYZE bevor Sie JOIN ausführen um sicherzustellen, dass der JOIN ausschließlich auf dem Index erfolgt. Sie sollten die Abfragepläne in jedem Fall überprüfen, um den relativen Unterschied zu sehen (oder dies einfach im Hinterkopf behalten, wenn die Datei JOIN ist nicht ganz so schnell, wie Sie möchten).

Antwort auf den Kommentar von @poshest:

Das klingt nach den Temp-Tabellen stapeln sich, was den Speicherbedarf erhöhen würde, und bei einer Verbindung mit langer Laufzeit scheint die Funktionalität ein Speicherleck zu sein.

In diesem Fall wäre es jedoch kein echtes Leck, da temp tables sind auf eine Verbindung beschränkt. Sie verschwinden automatisch, aber erst nach Beendigung der Verbindung. Sie können sie jedoch sofort verschwinden lassen, wenn Sie mit ihnen fertig sind. Einfach DROP die Tabelle wie jede andere, sobald Sie damit fertig sind, und ich vermute, Sie werden die Funktion ein paar Mal aufrufen können - über dieselbe Verbindung - ohne die gleiche Art von monotoner Speicherbedarfserhöhung.