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 JOINsobre umVALUEScláusula - (apenas mais rápido para listas de valores muito grandes):
COPYlista de valores para uma tabela temporária, indexe-a eJOINna 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: