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 einenVALUES
Klausel - (nur schneller für sehr große Wertelisten):
COPY
Werteliste in eine temporäre Tabelle, indizieren Sie sie undJOIN
in 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: