sql >> Base de Datos >  >> RDS >> PostgreSQL

Problema de rendimiento en la consulta de actualización

En orden aproximado de más lento a más rápido:

  • 200 consultas individuales, cada una en su propia transacción
  • 200 consultas individuales, todo en una sola transacción
  • 1 gran consulta con WHERE ... IN (...) o WHERE EXISTS (SELECT ...)
  • 1 gran consulta con INNER JOIN sobre un VALUES cláusula
  • (solo más rápido para listas de valores muy grandes):COPY lista de valores a una tabla temporal, indexarla y JOIN en la tabla temporal.

Si está utilizando cientos de valores, realmente sugiero unirse a través de un VALUES cláusula. Para muchos miles de valores, COPY a una tabla temporal e indexarla y luego unirse a ella.

Un ejemplo de unión en una cláusula de valores. Dado esto IN consulta:

SELECT *
FROM mytable
WHERE somevalue IN (1, 2, 3, 4, 5);

el equivalente con VALUES es:

SELECT *
FROM mytable
INNER JOIN (
  VALUES (1), (2), (3), (4), (5)
) vals(v)
ON (somevalue = v);

Tenga en cuenta, sin embargo, que el uso de VALUES de esta manera es una extensión de PostgreSQL, mientras que IN , o usar una tabla temporal, es el estándar de SQL.

Consulte esta pregunta relacionada: