Я копался в коде, чтобы понять, почему RETURN QUERY
не поддерживает параллельное выполнение.
Причина в том, что он использует курсор для получения результата запроса в пакетах по 50, а запросы, выполняемые с использованием курсора,не запускается параллельно (поскольку выполнение может быть приостановлено).
Это соответствующий код в функции exec_stmt_return_query
из src/pl/plpgsql/src/pl_exec.c
:
exec_stmt_return_query(PLpgSQL_execstate *estate,
PLpgSQL_stmt_return_query *stmt)
{
[...]
if (stmt->query != NULL)
{
/* static query */
exec_run_select(estate, stmt->query, 0, &portal);
}
[...]
while (true)
{
uint64 i;
SPI_cursor_fetch(portal, true, 50);
[...]