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 (...)
ellerWHERE EXISTS (SELECT ...)
- 1 stor fråga med en
INNER JOIN
över enVALUES
klausul - (endast snabbare för mycket stora värdelistor):
COPY
värdelista till en temporär tabell, indexera den ochJOIN
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: