In grober Reihenfolge von langsamer zu schneller:
- 200 einzelne Abfragen, jede in ihrer eigenen Transaktion
- 200 einzelne Abfragen, alles in einer Transaktion
- 1 große Abfrage mit
WHERE ... IN (...)oderWHERE EXISTS (SELECT ...) - 1 große Abfrage mit einem
INNER JOINüber einenVALUESKlausel - (nur schneller für sehr große Wertelisten):
COPYWerteliste in eine temporäre Tabelle, indizieren Sie sie undJOINin der temporären Tabelle.
Wenn Sie Hunderte von Werten verwenden, empfehle ich wirklich, sich über VALUES zu verbinden Klausel. Für viele tausend Werte COPY zu einer temporären Tabelle hinzufügen, indizieren und dann verknüpfen.
Ein Beispiel für den Beitritt zu einer Werteklausel. Angesichts dieses IN Abfrage:
SELECT *
FROM mytable
WHERE somevalue IN (1, 2, 3, 4, 5);
das Äquivalent mit VALUES ist:
SELECT *
FROM mytable
INNER JOIN (
VALUES (1), (2), (3), (4), (5)
) vals(v)
ON (somevalue = v);
Beachten Sie jedoch, dass die Verwendung von VALUES this way ist eine PostgreSQL-Erweiterung, während IN , oder die Verwendung einer temporären Tabelle, ist SQL-Standard.
Siehe diese verwandte Frage: