带有 OFFSET 的 PostgreSQL LIMIT 不能超过 100000

PostgreSQL LIMIT with OFFSET is not working beyond 100000

我正在为我的项目使用 postgres (9.6) docker。加载大量数据后,例如 234453,我需要使用 limit 和 offset 将数据切割成块。但我观察到我的查询在超过 100000 的限制时被挂起。 就像我给 limit 100000 的时候可以切。但是当我使用 120000 的时候,它挂了。

已加载数据:234453 行 询问: 这是工作: docker exec -it pg_1 psql -P pager postgres postgres -t -c "delete from schema1.table1 where col_id not in (select col_id from schema1 .table1 限制 100000 偏移量 1)"

这是挂起的: docker exec -it pg_1 psql -P pager postgres postgres -t -c "delete from schema1.table1 where col_id not in (select col_id from schema1 .table1 限制 120000 偏移量 1)"

下一次削减应该是从 100001 到 230000,大约是这样。

你能告诉我吗,我该怎么做?还是我做错了什么?

谢谢, 苏文杜

Offset Pagination只有在OFFSET值比较小的情况下才有效率。

否则,即使您索引了排序和过滤条件,DB 也必须扫描索引并对条目进行计数,直到达到正确的OFFSET 值。对于非常大的值,这意味着几乎整个索引都被扫描了。

所以,你最好使用 Keyset Pagination

我已经尝试使用 row_number() 并且它也适用于大量数据。 以下是我的查询:

docker exec -it pg_1 psql -P pager postgres postgres -t -c "delete from schema1.table1 WHERE col_id NOT IN (SELECT x.col_id FROM (select col_id , ROW_NUMBER () OVER (ORDER BY col_id) from schema1.table1) x WHERE ROW_NUMBER BETWEEN 100001 AND 230000) “