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 JOIN
sur unVALUES
clause - (uniquement plus rapide pour les très grandes listes de valeurs) :
COPY
liste de valeurs dans une table temporaire, indexez-la etJOIN
sur 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 :