Dans l'ordre approximatif du plus lent au plus rapide :
- 200 requêtes individuelles, chacune dans sa propre transaction
- 200 requêtes individuelles, le tout en une seule transaction
- 1 grande requête avec
WHERE ... IN (...)ouWHERE EXISTS (SELECT ...) - 1 grande requête avec un
INNER JOINsur unVALUESclause - (uniquement plus rapide pour les très grandes listes de valeurs) :
COPYliste de valeurs dans une table temporaire, indexez-la etJOINsur la table temporaire.
Si vous utilisez des centaines de valeurs, je suggère vraiment de les joindre sur un VALUES clause. Pour plusieurs milliers de valeurs, COPY à une table temporaire et indexez-la puis joignez-la.
Un exemple de jointure sur une clause de valeurs. Étant donné ce IN requête :
SELECT *
FROM mytable
WHERE somevalue IN (1, 2, 3, 4, 5);
l'équivalent avec VALUES est :
SELECT *
FROM mytable
INNER JOIN (
VALUES (1), (2), (3), (4), (5)
) vals(v)
ON (somevalue = v);
Notez cependant que l'utilisation de VALUES this way est une extension PostgreSQL, alors que IN , ou en utilisant une table temporaire, est le standard SQL.
Voir cette question connexe :