私のアプリケーションは Postgres テーブルからすべての行を取得する必要がありますが、不明な制約があるため、1 つのクエリから返される結果の数を制限する必要があります (たとえばlimit l
( l=100000
))。
したがって、オフセットと制限を使用したページネーションが当面の解決策として頭に浮かびます。ただし、Postgre のドキュメントに は次のように記載されています。
句によってスキップされた行は
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
行を取得する効率的な方法は何ですか?