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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章