PostgreSQL 分页

Postgresql的分页方式很多,https://www.postgresql.org/docs/current/queries-limit.html

举2个例子

1、LIMIT and OFFSET    

LIMIT和OFFSET允许您只检索查询其余部分生成的行的一部分:

SELECT select_list FROM table_expression [ ORDER BY ... ]
[ LIMIT {number| ALL } ] [ OFFSETnumber]
//query 0-100000, 0-start  100000-count
select id,name from test.flstest2 order by id asc limit 100000 offset 0

//query 100000-200000, 100000-start  100000-count
select id,name from test.flstest2 order by id asc limit 100000 offset 100000

如果给定了一个限制计数,那么返回的行数不会超过这个数(但是如果查询本身生成的行数更少,则返回的行数可能更少)。LIMIT ALL等同于省略LIMIT子句,就像使用NULL参数的LIMIT一样。

OFFSET:在开始返回行之前跳过那么多行。偏移量0与省略偏移子句相同,即使用NULL参数进行偏移。

使用LIMIT时,一定要使用ORDER BY子句,它将结果行约束为惟一的顺序。否则,您将得到不可预测的查询行的子集。你可能会问第十行到第二十行,但是第十行到第二十行是什么顺序呢?顺序是未知的,除非您指定了ORDER BY。

2、ROW_NUMBER and OVER

语法: 

ROW_NUMBER() OVER( [ PRITITION BY col1] ORDER BY col2[ DESC ] ) 

解释: 
 ROW_NUMBER()为返回的记录定义个行编号, PARTITION BY col1 是根据col1分组,ORDER BY col2[ DESC ]是根据col2进行排序。 
 

select ctid from(
		select rownum as rn, ctid from (
			SELECT row_number() over(order by ctid) as rownum,id FROM test.flstest2 
		) as t_1 WHERE rownum < 100000
	) as t_2 where rn >= 0

 

总结:

1、如果按照代码简洁,还是喜欢LIMIT方式。

2、根据查询计划分析,其实相差不大

LIMIT

explain analyze 
select id,name from test.flstest2 order by ctid asc limit 100000 offset 0

 

ROW_NUMBER

explain analyze select ctid from(
select rownum as rn, ctid from (
    SELECT row_number() over(order by ctid) as rownum,ctid FROM test.flstest2 
		) as t_1 WHERE rownum < 100000
	) as t_2 where rn >= 0

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值