PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Problema di prestazioni nella query di aggiornamento

In ordine approssimativo da più lento a più veloce:

  • 200 query singole, ciascuna nella propria transazione
  • 200 query singole, tutte in un'unica transazione
  • 1 grande query con WHERE ... IN (...) o WHERE EXISTS (SELECT ...)
  • 1 grande query con un INNER JOIN su un VALUES clausola
  • (più veloce solo per elenchi di valori molto grandi):COPY lista valori in una tabella temporanea, indicizzarla e JOIN sul tavolo temporaneo.

Se stai usando centinaia di valori, ti suggerisco davvero di unirti su un VALUES clausola. Per molte migliaia di valori, COPY in una tabella temporanea e indicizzarla, quindi unirti a essa.

Un esempio di unione su una clausola di valori. Dato questo IN domanda:

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

l'equivalente con VALUES è:

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

Tieni presente, tuttavia, che utilizzando VALUES in questo modo è un'estensione PostgreSQL, mentre IN , o l'utilizzo di una tabella temporanea, è lo standard SQL.

Vedi questa domanda correlata: