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;为什么要成批循环而不是逐行循环?这会更简单。