Я пытаюсь понять, как на самом деле работают циклы внутри функции 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 действительных результатов против миллиона результатов.
Будет ли она загружать все результаты одновременно, а затем выполнять итерацию по ним или итерацию по их кусками?