我的应用程序需要从 Postgres 表中检索所有行,但是,由于未知的约束,我必须限制从一个查询返回的结果的数量,比如limit l
( l=100000
)。
因此,我想到了一个带有偏移和限制的分页作为一个直接的解决方案。但是,Postgres 文档 说:
子句跳过的行
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
行的有效方法?