Скажем, у нас есть запрос SELECT
, который принимает некоторые параметры и возвращает не более одной строки
SELECT c FROM Foo WHERE a = 'a' AND b = 'b' LIMIT 1;
(этот запрос является лишь примером и может быть произвольно сложным)
Мы можем поставить это за CREATE PROCEDURE
, которое мы можем затем назвать, как
CALL get_foo_c('a', 'b');
Все замечательно, но, скажем, у меня нет только одной пары (a, b)
, но у меня есть список из них, и я хочу получить список c
ответов.
CALL get_foo_c('a1', 'b1');
CALL get_foo_c('a2', 'b2');
CALL get_foo_c('a3', 'b3');
...
, получающих обратно объединение всех запросов, в порядке их запроса
'c1'
'c2'
'c3'
Задержка при выполнении запроса довольно высока, поэтому одновременная выдача одного запроса невозможна.
Очевидно, что мы можем просто выполнять запросы параллельно на стороне клиента. Однако я ищу альтернативы по причинам, которые не имеют отношения к данному вопросу, например, представьте, что язык клиента является однопоточным.
Это возвращает нас к вопросу: можем ли мы выполнить несколько независимых (в смысл, что они не влияют друг на друга) запросы в postgresql? Возможно, с API, который выглядит как
CALL get_many_foo_c(('a1','b1'),('a2','b2'),('a3','b3'));
, получая тот же ответ, как если бы запросы были выполнены по одному за раз.
Я исследовал возможность использования FOR LOOP
над входными параметрами, но я не мог понять, как заставить его работать, и в любом случае было бы идеально, если бы postgresql internall должен был иметь возможность распараллеливать каждый независимый запрос.