Postgresql SELECT语句的历史结果
我想查询大量行并显示给用户,但是用户只会看到例如10行,我将使用“限制”和“偏移”,他将在用户界面中按“下一步”按钮,然后提取接下来的10行 数据库将一直更新,是否有任何方法可以保证用户将看到下10行的数据,就像在第一次选择中一样,因此,如果用户选择查看下10行结果,则不会反映数据中的任何更改Postgresql SELECT语句的历史结果,postgresql,pagination,Postgresql,Pagination,我想查询大量行并显示给用户,但是用户只会看到例如10行,我将使用“限制”和“偏移”,他将在用户界面中按“下一步”按钮,然后提取接下来的10行 数据库将一直更新,是否有任何方法可以保证用户将看到下10行的数据,就像在第一次选择中一样,因此,如果用户选择查看下10行结果,则不会反映数据中的任何更改 这就像使用SELECT语句作为过去的快照一样,第一次SELECT之后的任何后续更新对于后续SELECT LIMIT OFFSET都将不可见。您可以使用游标,例如: drop table if exists
这就像使用SELECT语句作为过去的快照一样,第一次SELECT之后的任何后续更新对于后续SELECT LIMIT OFFSET都将不可见。您可以使用游标,例如:
drop table if exists test;
create table test(id int primary key);
insert into test
select i from generate_series(1, 50) i;
declare cur cursor with hold for
select * from test order by id;
move absolute 0 cur; -- get 1st page
fetch 5 cur;
id
----
1
2
3
4
5
(5 rows)
truncate test;
move absolute 5 cur; -- get 2nd page
fetch 5 cur; -- works even though the table is already empty
id
----
6
7
8
9
10
(5 rows)
close cur;
请注意,这是一个相当昂贵的解决方案。声明的游标将创建一个包含完整结果集(快照)的临时表。这可能会导致严重的服务器负载。就我个人而言,我宁愿寻找替代方法(具有动态结果)
阅读文档:,。您想要的是所谓的分页性能非常重要,它将作为一个概念工作,但不是一种实用的方式。如果您想要快照,实际上您别无选择。一旦创建,光标将非常快。主要的成本是创建一个临时表。或者,您可以在客户端维护分页,但这需要将整个结果发送到客户端。