sql >> Databasteknik >  >> RDS >> PostgreSQL

Prestandaproblem i uppdateringsfrågan

I grov ordning av långsammare till snabbare:

  • 200 individuella frågor, var och en i sin egen transaktion
  • 200 individuella frågor, allt i en transaktion
  • 1 stor fråga med WHERE ... IN (...) eller WHERE EXISTS (SELECT ...)
  • 1 stor fråga med en INNER JOIN över en VALUES klausul
  • (endast snabbare för mycket stora värdelistor):COPY värdelista till en temporär tabell, indexera den och JOIN på vikariebordet.

Om du använder hundratals värden föreslår jag verkligen att du går med över en VALUES klausul. För många tusen värden, COPY till en tillfällig tabell och indexera den och gå sedan med på den.

Ett exempel på att gå med på en värdeklausul. Givet denna IN fråga:

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

motsvarande med VALUES är:

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

Observera dock att du använder VALUES detta sätt är ett PostgreSQL-tillägg, medan IN , eller använder en temporär tabell, är SQL-standard.

Se den här relaterade frågan:



  1. Hur återställer jag till en annan databas i SQL Server?

  2. Felaktigt datum/tidsvärde:''2012-07-14 23:00:00''

  3. Hur Cosd() fungerar i PostgreSQL

  4. SYS_GUID() Funktion i Oracle