我的应用程序需要从Postgres表中检索所有行,但是,由于未知的约束,我必须限制从一个查询返回的结果的数量,比如limit l
(l=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
行的有效方法?
答案 0 :(得分:-4)
您可以使用LIMIT和OFFSET在PostgreSQL中执行分页。 您只需传递页码和页面大小。 我已经为此创建了一个示例。 请访问我的博客。 http://www.dbrnd.com/2015/05/postgresql-paging-query-limit-offset/