В груб ред от по-бавно към по-бързо:
- 200 отделни заявки, всяка в отделна транзакция
- 200 отделни заявки, всички в една транзакция
- 1 голяма заявка с
WHERE ... IN (...)илиWHERE EXISTS (SELECT ...) - 1 голяма заявка с
INNER JOINнадVALUESклауза - (само по-бързо за много големи списъци със стойности):
COPYсписък със стойности към временна таблица, индексирайте я иJOINна временната таблица.
Ако използвате стотици стойности, наистина предлагам да се присъедините към VALUES клауза. За много хиляди стойности, COPY към временна таблица и я индексирайте, след което се присъединете към нея.
Пример за присъединяване към клауза за стойности. Предвид това IN заявка:
SELECT *
FROM mytable
WHERE somevalue IN (1, 2, 3, 4, 5);
еквивалентът на VALUES е:
SELECT *
FROM mytable
INNER JOIN (
VALUES (1), (2), (3), (4), (5)
) vals(v)
ON (somevalue = v);
Обърнете внимание обаче, че използването на VALUES този начин е разширение на PostgreSQL, докато IN , или използването на временна таблица, е SQL стандарт.
Вижте този свързан въпрос: