PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Problème de performances dans la requête de mise à jour

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 (...) ou WHERE EXISTS (SELECT ...)
  • 1 grande requête avec un INNER JOIN sur un VALUES clause
  • (uniquement plus rapide pour les très grandes listes de valeurs) :COPY liste de valeurs dans une table temporaire, indexez-la et JOIN 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 :