В груб ред от по-бавно към по-бързо:
- 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 стандарт.
Вижте този свързан въпрос: