In grove volgorde van langzamer naar sneller:
- 200 individuele zoekopdrachten, elk in hun eigen transactie
- 200 individuele zoekopdrachten, allemaal in één transactie
- 1 grote vraag met
WHERE ... IN (...)
ofWHERE EXISTS (SELECT ...)
- 1 grote vraag met een
INNER JOIN
over eenVALUES
clausule - (alleen sneller voor zeer grote zoeklijsten):
COPY
waardelijst naar een tijdelijke tabel, indexeer deze enJOIN
op de tijdelijke tafel.
Als je honderden waarden gebruikt, raad ik je echt aan mee te doen via een VALUES
clausule. Voor vele duizenden waarden, COPY
naar een tijdelijke tabel en indexeer deze en doe er vervolgens mee.
Een voorbeeld van deelname aan een waardenclausule. Gezien deze IN
vraag:
SELECT *
FROM mytable
WHERE somevalue IN (1, 2, 3, 4, 5);
het equivalent met VALUES
is:
SELECT *
FROM mytable
INNER JOIN (
VALUES (1), (2), (3), (4), (5)
) vals(v)
ON (somevalue = v);
Houd er echter rekening mee dat het gebruik van VALUES
deze manier is een PostgreSQL-extensie, waar IN
, of het gebruik van een tijdelijke tabel, is standaard SQL.
Zie deze gerelateerde vraag: