在Postgres中有效地检索具有分页的所有行

时间:2014-08-28 14:59:40

标签: postgresql pagination offset sql-limit

我的应用程序需要从Postgres表中检索所有行,但是,由于未知的约束,我必须限制从一个查询返回的结果的数量,比如limit ll=100000)。

因此,作为一种直接的解决方案,我想到了偏移和限制的分页。但是,Postgres documentation说:

  

OFFSET子句跳过的行仍然需要在里面计算   服务器;因此,大OFFSET可能效率低下。

因此,如果我通过分页pages_count * l请求[1, l], [l+1, 2*l], ..., [(pages_count-1)*l+1, pages_count*l]行,实际上(pages_count*l+1)*pages_count*l/2将会读取O(sqr(pages_count*l))行。

for page_number := 0; page_number < pages_count; page_number++ {
 retrieve_and_store("select amount from transactions order by time offset $page_number limit 100000")
}

或者Postgres是否会缓存最近查询中的行,或者什么是检索所有page_count*l行的有效方法?

1 个答案:

答案 0 :(得分:-4)

您可以使用LIMIT和OFFSET在PostgreSQL中执行分页。 您只需传递页码和页面大小。 我已经为此创建了一个示例。 请访问我的博客。 http://www.dbrnd.com/2015/05/postgresql-paging-query-limit-offset/