【问题标题】:Postgres function FOR IN SELECT LOOP scalingPostgres 函数 FOR IN SELECT LOOP 缩放
【发布时间】:2020-02-11 04:50:33
【问题描述】:

我试图了解循环在 postgres 函数中的实际工作方式。

问题是,当使用这样的 SELECT 查询运行 FOR LOOP 时:

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 LOOP 将运行少量迭代,然后退出。

(...)
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
(...)

我试图了解这种类型的循环将如何扩展。性能有何不同 - 如果要查询的表有 100 个有效结果而不是 100 万个结果。

它会一次加载所有结果,然后对其进行迭代,还是分块进行迭代?

【问题讨论】:

    标签: postgresql function for-loop


    【解决方案1】:

    PostgreSQL 在内部使用游标来处理这样的循环。这意味着结果是逐行计算的,没有内部缓冲区溢出的危险。

    【讨论】:

      猜你喜欢
      • 2013-09-23
      • 1970-01-01
      • 1970-01-01
      • 2018-09-12
      • 1970-01-01
      • 2015-10-23
      • 2021-12-05
      • 2020-11-17
      • 1970-01-01
      相关资源
      最近更新 更多