Postgresql 之分页技术(三)

作者:瀚高PG实验室 (Highgo PG Lab)- 波罗
游标分页
如何使用游标分页?
– 开启一个事务
BEGIN;
– 定义游标
DECLARE medley_cur CURSOR FOR SELECT * FROM medley;
– 获取10条记录
FETCH 10 FROM medley_cur;
– …
– 继续获取10条记录
FETCH 10 FROM medley_cur;
–最后结束事务
COMMIT;

测试:游标分页
创建一个测试表,并插入十万条记录:
postgres=# create table test(id int,name varchar);
CREATE TABLE
postgres=# insert into test values(generate_series(1,100000),‘aaa’);
INSERT 0 100000

在一个事务中,使用游标进行分页:
postgres=# begin;
BEGIN
postgres=# declare mycur cursor for select * from test;
DECLARE CURSOR
postgres=# fetch 5 from mycur;
id | name
----±-----
1 | aaa
2 | aaa
3 | aaa
4 | aaa
(5 rows)

postgres=# fetch 5 from mycur;
id | name
----±-----

5 | aaa
6 | aaa
7 | aaa
8 | aaa
9 | aaa
10 | aaa
(5 rows)

postgres=# commit;
COMMIT

postgres=#

游标分页的原理:首先要把相关数据加载到内存中,然后再进行提取数据。

使用游标分页,两个必须:
大数据量的时候,必须过滤掉不需要的数据,否则将会消耗大量的系统资源。
游标使用完毕后,必须关闭,否则系统资源将被耗尽。

已创建完成的游标,不会随着数据的更新而更新。
所以,在相关数据更新之后,已经创建的 cursor 的数据就陈旧了。

测试:游标分页的弊端
Session1:启动一个事务,使用游标进行分页
highgo=# create table test(id int,name varchar);
CREATE TABLE
highgo=# insert into test values (generate_series(1,1000),‘aaa’);
INSERT 0 1000
highgo=# begin;
BEGIN
highgo=# declare mycur cursor for select * from test;
DECLARE CURSOR
highgo=# fetch 5 from mycur;
id | name
----±-----
1 | aaa
2 | aaa
3 | aaa
4 | aaa
5 | aaa
(5 行记录)
highgo=#

Session2:在启动一个会话,删除id=9的记录
H:\highgo\database\4.1.1\bin>psql highgo highgo
psql (4.1.1)

PSQL: Release 4.1.1
Connected to:
HighGo Database V4.1 Enterprise Edition Release 4.1.1 - 64-bit Production
输入 “help” 来获取帮助信息.

highgo=# delete from test where id=9;
DELETE 1
highgo=#

Session1:继续查询下一页,发现删除的数据还存在。
highgo=# fetch 5 from mycur;
id | name
----±-----
6 | aaa
7 | aaa
8 | aaa
9 | aaa
10 | aaa
(5 行记录)

highgo=#

游标分页:虽然不会出现数据结果不一样的情况,但是读取的是历史数据。另外大数据量的情况,也需要条件过滤,否则可能造成系统资源大量的消耗。

说明:以上内容来源于瀚高基础软件 韩永利老师 分页技术分享部分章节,特此鸣谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值