Em ordem aproximada de mais lento para mais rápido:
- 200 consultas individuais, cada uma em sua própria transação
- 200 consultas individuais, tudo em uma transação
- 1 grande consulta com
WHERE ... IN (...)
ouWHERE EXISTS (SELECT ...)
- 1 consulta grande com um
INNER JOIN
sobre umVALUES
cláusula - (apenas mais rápido para listas de valores muito grandes):
COPY
lista de valores para uma tabela temporária, indexe-a eJOIN
na mesa temporária.
Se você estiver usando centenas de valores, eu realmente sugiro juntar um
VALUES
cláusula. Para muitos milhares de valores, COPY
para uma tabela temporária e indexe-a e, em seguida, junte-se a ela. Um exemplo de junção em uma cláusula de valores. Dado este
IN
consulta:SELECT *
FROM mytable
WHERE somevalue IN (1, 2, 3, 4, 5);
o equivalente com
VALUES
é:SELECT *
FROM mytable
INNER JOIN (
VALUES (1), (2), (3), (4), (5)
) vals(v)
ON (somevalue = v);
Observe, no entanto, que usar
VALUES
desta forma é uma extensão do PostgreSQL, enquanto IN
, ou usando uma tabela temporária, é o padrão SQL. Veja esta pergunta relacionada: