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