Postgresql 在PL/pgSQL查询中使用带有UUID的SQL“seek”进行排序

Postgresql 在PL/pgSQL查询中使用带有UUID的SQL“seek”进行排序,postgresql,performance,loops,plpgsql,offset,Postgresql,Performance,Loops,Plpgsql,Offset,我有一张如下所示的表: CREATE TABLE tmp ( id uuid primary key, other_id uuid, ... ); 这个表有数百万个条目,我需要:循环遍历所有条目,检查并比较其中一些字段的值与另一个表的值,然后更正这些值 我不想使用标准订单。。。限度抵消方法,因为其性能因大偏移量而受到很大影响。因此,我尝试使用seek索引方法,例如 我的问题是我遇到了一个错误,我不知道在PL/pgSQL代码中如何从概念上解决这些错误。大概是这样的: --

我有一张如下所示的表:

CREATE TABLE tmp (
    id uuid primary key,
    other_id uuid,
    ...
);
这个表有数百万个条目,我需要:循环遍历所有条目,检查并比较其中一些字段的值与另一个表的值,然后更正这些值

我不想使用标准订单。。。限度抵消方法,因为其性能因大偏移量而受到很大影响。因此,我尝试使用seek索引方法,例如

我的问题是我遇到了一个错误,我不知道在PL/pgSQL代码中如何从概念上解决这些错误。大概是这样的:

-- Get initial offset
SELECT id INTO _id_offset
FROM tmp
WHERE ...
ORDER BY id DESC
LIMIT 1

WHILE ... LOOP -- Loop until some fixed high value to prevent infinite loop, just in case

    SELECT id, other_id, ... INTO rows_to_update
    FROM tmp
    WHERE id < _id_offset AND (...) -- Latter part is same condition as above
    ORDER BY id DESC
    FETCH NEXT _batch_size ROWS ONLY

    -- Get next offset
    SELECT id INTO _id_offset
    FROM rows_to_update
    ORDER BY id ASC -- ASC to get the "last" id from above. Cannot simply use _batch_size offset as there may be fewer entries left.
    LIMIT 1

    -- Update relevant records, check # of updated records to see
    -- if we can terminate loop early, update loop condition
    ...

END LOOP;

毫不奇怪,第一个和最后一个条目被跳过,因为您可以使用for循环抱歉,我应该澄清一下:第二个和第三个查询是WHILE循环的一部分。它使用GET DIAGNOSTICS循环,直到没有更多的记录需要更新_update_count=row_count;为什么要成批循环而不是逐行循环?这会更简单。