Postgres функция FOR IN SELECT L OOP масштабирование - PullRequest
2 голосов
/ 11 февраля 2020

Я пытаюсь понять, как на самом деле работают циклы внутри функции postgres.

Вопрос в том, когда FOR L OOP запускается с запросом SELECT, подобным следующему:

FOR v_tmp_pk IN SELECT user_pk
                        FROM users_table
                        WHERE enterprise_id = in_enterprise_id
                            AND
                             category_id = in_category_id
                            AND status = 0 ORDER BY user_pk LOOP

Загружаются ли все результаты запроса одновременно или они разбиты на страницы и вернулся как psql вернул бы их? Фактический FOR L OOP будет выполняться в течение небольшого числа итераций и затем завершится.

(...)
DECLARE
        v_user_pks int[];
        v_tmp_pk int;
BEGIN


FOR v_tmp_pk IN SELECT user_pk
                        FROM users_table
                        WHERE enterprise_id = in_enterprise_id
                            AND
                             category_id = in_category_id
                            AND status = 0 ORDER BY user_pk LOOP

    -- Try to get a lock on the record
    IF pg_try_advisory_xact_lock(v_tmp_pk) THEN

        -- Push in the array we are tracking
        v_user_pks = array_append(v_user_pks, v_tmp_pk);
    end if;

    -- If we have collected enough records, then come out of the loop
   EXIT WHEN array_length(v_user_pks, 1) = in_count;
end loop;

-- Do more things
(...)

Я пытаюсь понять, как будет масштабироваться этот тип l oop. Как будет отличаться производительность - если запрашиваемая таблица имеет несколько 100 действительных результатов против миллиона результатов.

Будет ли она загружать все результаты одновременно, а затем выполнять итерацию по ним или итерацию по их кусками?

1 Ответ

1 голос
/ 11 февраля 2020

PostgreSQL использует курсор для внутренней обработки всего этого oop. Это означает, что результаты вычисляются построчно, и нет опасности переполнения внутреннего буфера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...