sql >> Databáze >  >> RDS >> PostgreSQL

Problém s výkonem v aktualizačním dotazu

V hrubém pořadí od pomalejšího po rychlejší:

  • 200 jednotlivých dotazů, každý ve své vlastní transakci
  • 200 jednotlivých dotazů, vše v jedné transakci
  • 1 velký dotaz s WHERE ... IN (...) nebo WHERE EXISTS (SELECT ...)
  • 1 velký dotaz s INNER JOIN přes VALUES doložka
  • (pouze rychlejší pro velmi velké seznamy hodnot):COPY hodnot do dočasné tabulky, indexujte ji a JOIN na dočasném stole.

Pokud používáte stovky hodnot, opravdu doporučuji spojení přes VALUES doložka. Pro mnoho tisíc hodnot COPY do dočasné tabulky a indexovat ji a poté se k ní připojit.

Příklad spojení na klauzuli hodnot. Vzhledem k tomuto IN dotaz:

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

ekvivalent s VALUES je:

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

Pamatujte však, že pomocí VALUES tímto způsobem je rozšíření PostgreSQL, kde je IN , nebo pomocí dočasné tabulky, je standard SQL.

Viz tato související otázka:



  1. Extrahujte znaky napravo od hodnoty s oddělovači v příkazu SELECT

  2. Optimalizace dotazu MySQL pro celočíselné rozsahové vyhledávání

  3. INSERT INTO se nezdaří s node-mysql

  4. pgFincore 1.2, rozšíření PostgreSQL