PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Leistungsproblem in Update-Abfrage

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 (...) oder WHERE EXISTS (SELECT ...)
  • 1 große Abfrage mit einem INNER JOIN über einen VALUES Klausel
  • (nur schneller für sehr große Wertelisten):COPY Werteliste in eine temporäre Tabelle, indizieren Sie sie und JOIN 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: